J'ai une interface qui a une certaine quantité de fonctionnalités bien définies. Disons:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Cela fonctionne bien pour la plupart des implémentations de l'interface, mais dans quelques cas, j'ai besoin d'ajouter de nouvelles fonctionnalités (comme peut-être intégrées dans une nouvelle méthode createBrownies()
). L'approche évidente / naïve pour ce faire serait d'étendre l'interface:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Mais a un assez gros inconvénient en ce que je ne peux pas ajouter la nouvelle fonctionnalité sans modifier l'API existante (comme changer la classe pour utiliser la nouvelle interface).
Je pensais utiliser un adaptateur pour ajouter la fonctionnalité après l'instanciation:
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Ce qui me rapporterait quelque chose comme:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Cela semble être une bonne solution au problème, mais je me demande si j'éveille les anciens dieux en le faisant. L'adaptateur est-il la voie à suivre? Y a-t-il un meilleur schéma à suivre? Ou dois-je vraiment mordre la balle et étendre simplement l'interface d'origine?