Пример на псевдокоде
UserProvider userProvider = new UserProviderAggregate(
new LoggerUserProviderDecorator(
new CacheUserProviderDecorator(
new UserProvider(...)
new Cache(),
),
new Logger(),
),
new DummyUserProvider()
)
все классы UserProviderAggregate, LoggerUserProviderDecorator, CacheUserProviderDecorator, DummyUserProvider и UserProvider
реализуют UserProviderInterface... по сути представляют из себя реализации этой абстракции
Просто каждый передает внутренней зависимости этого же типа (UserProviderInterface) работу внутри своей реализации метода этой абстракции
public function loadUsers(): Collection<User> {
return new Collection<User>(...);
}
или cache:
public function loadUsers(): Collection<User> {
if(cache.has('cache_users_key')) {
return cache.get('cache_users_key');
}
Collection<User> users = new Collection<User>(...)
cache.put('cache_users_key', users)
return users;
}
или агрегированные:
public function loadUsers(): Collection<User> {
if(...any condition) {
return dbUsers.loadUsers();
}
if(...any condition) {
return dummyUsers.loadUsers();
}
throw new Exception();
}