Ho un'interfaccia che ha una certa quantità di funzionalità ben definite. Diciamo:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Questo funziona bene per la maggior parte delle implementazioni dell'interfaccia, ma in alcuni casi, ho bisogno di aggiungere alcune nuove funzionalità (come forse inserito in un nuovo metodo createBrownies()
). L'approccio ovvio / ingenuo per fare questo sarebbe estendere l'interfaccia:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Ma ha un grosso svantaggio in quanto non posso aggiungere la nuova funzionalità senza modificare l'API esistente (come cambiare la classe per usare la nuova interfaccia).
Stavo pensando di utilizzare un adattatore per aggiungere la funzionalità dopo l'istanza:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Il che mi farebbe guadagnare qualcosa del tipo:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Sembra una buona soluzione al problema, ma mi chiedo se sto risvegliando i vecchi dei facendolo. L'adattatore è la strada da percorrere? C'è un modello migliore da seguire? O dovrei davvero solo mordere il proiettile ed estendere l'interfaccia originale?