У меня есть интерфейс, который имеет определенное количество четко определенных функций. Скажем так:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Это хорошо работает для большинства реализаций интерфейса, но в некоторых случаях мне нужно добавить некоторые новые функциональные возможности (например, возможно, в новый метод createBrownies()
). Очевидный / наивный подход к этому состоит в расширении интерфейса:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Но у него есть довольно большой недостаток в том, что я не могу добавить новую функциональность без изменения существующего API (например, изменение класса для использования нового интерфейса).
Я думал об использовании адаптера для добавления функциональности после создания экземпляра:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Который будет чистым мне что-то вроде:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Это кажется хорошим решением проблемы, но мне интересно, пробуждаю ли я старых богов, делая это. Адаптер - это путь? Есть ли лучший образец для подражания? Или я должен просто кусать пулю и просто расширять оригинальный интерфейс?