Eu tenho uma interface que possui uma certa quantidade de funcionalidades bem definidas. Digamos:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Isso funciona bem para a maioria das implementações da interface, mas em alguns casos, preciso adicionar algumas novas funcionalidades (como talvez incorporadas a um novo método createBrownies()
). A abordagem óbvia / ingênua de fazer isso seria estender a interface:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Mas tem uma desvantagem bastante grande: não posso adicionar a nova funcionalidade sem modificar a API existente (como alterar a classe para usar a nova interface).
Eu estava pensando em usar um adaptador para adicionar a funcionalidade após a instanciação:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
O que me renderia algo como:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Parece uma boa solução para o problema, mas estou me perguntando se estou despertando os deuses antigos fazendo isso. O adaptador é o caminho a seguir? Existe um padrão melhor a seguir? Ou devo apenas estar mordendo a bala e estendendo a interface original?