Ich habe eine Schnittstelle, die eine bestimmte Menge an gut definierten Funktionen hat. Sagen wir:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Dies funktioniert gut für die meisten Implementierungen der Schnittstelle, aber in einigen Fällen muss ich einige neue Funktionen hinzufügen (wie vielleicht in eine neue Methode gerollt, createBrownies()
). Der naheliegende / naive Ansatz wäre, die Schnittstelle zu erweitern:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Das hat aber den großen Nachteil, dass ich die neue Funktionalität nicht hinzufügen kann, ohne die vorhandene API zu ändern (wie das Ändern der Klasse, um die neue Schnittstelle zu verwenden).
Ich dachte darüber nach, einen Adapter zu verwenden, um die Funktionalität nach der Instanziierung hinzuzufügen:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Was würde mich soetwas net:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Dies scheint eine gute Lösung für das Problem zu sein, aber ich frage mich, ob ich damit die alten Götter erwecke. Ist der Adapter der richtige Weg? Gibt es ein besseres Muster, dem man folgen kann? Oder sollte ich wirklich nur die Kugel beißen und nur die ursprüngliche Schnittstelle erweitern?