特定の量の明確に定義された機能を備えたインターフェイスがあります。まあ言ってみれば:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
これはインターフェイスのほとんどの実装でうまく機能しますが、いくつかのインスタンスでは、いくつかの新しい機能を追加する必要があります(新しいメソッドにロールインするなどcreateBrownies()
)。これを行うための明白/単純なアプローチは、インターフェースを拡張することです。
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
しかし、既存のAPIを変更せずに新しい機能を追加できないという点でかなり大きな欠点があります(新しいインターフェイスを使用するようにクラスを変更するなど)。
インスタンス化後に機能を追加するためにアダプターを使用することを考えていました。
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
これは私に次のようになります:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
これは問題の良い解決策のように思えますが、私はそれをすることで古い神々を目覚めさせているのだろうかと思っています。アダプタは進むべき道ですか?従うべきより良いパターンはありますか?それとも、本当に弾丸を噛んで、元のインターフェイスを拡張するだけですか?