Tengo una interfaz que tiene una cierta cantidad de funcionalidad bien definida. Digamos:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Esto funciona bien para la mayoría de las implementaciones de la interfaz, pero en algunos casos, necesito agregar algunas funcionalidades nuevas (como quizás un nuevo método createBrownies()
). El enfoque obvio / ingenuo para hacer esto sería extender la interfaz:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Pero tiene una desventaja bastante grande en que no puedo agregar la nueva funcionalidad sin modificar la API existente (como cambiar la clase para usar la nueva interfaz).
Estaba pensando en usar un adaptador para agregar la funcionalidad después de la creación de instancias:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Lo que me daría algo como:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Esto parece una buena solución al problema, pero me pregunto si estoy despertando a los viejos dioses al hacerlo. ¿Es el adaptador el camino a seguir? ¿Hay un mejor patrón a seguir? ¿O realmente debería estar mordiendo la bala y simplemente extendiendo la interfaz original?