Mam interfejs, który ma pewną liczbę dobrze zdefiniowanych funkcji. Powiedzmy:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Działa to dobrze w przypadku większości implementacji interfejsu, ale w kilku przypadkach muszę dodać nową funkcjonalność (np. Być może wprowadzoną do nowej metody createBrownies()
). Oczywistym / naiwnym podejściem do tego byłoby rozszerzenie interfejsu:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Ma jednak dość duży minus, że nie mogę dodać nowej funkcjonalności bez modyfikacji istniejącego API (np. Zmiany klasy w celu użycia nowego interfejsu).
Myślałem o użyciu adaptera, aby dodać funkcjonalność po utworzeniu wystąpienia:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Co dałoby mi coś takiego:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Wydaje się, że to dobre rozwiązanie problemu, ale zastanawiam się, czy budzę starych bogów, robiąc to. Czy adapter jest właściwą drogą? Czy jest lepszy wzór do naśladowania? A może powinienem po prostu gryźć kulę i rozszerzać oryginalny interfejs?