Belirli miktarda iyi tanımlanmış işlevselliğe sahip bir arabirim var. Diyelimki:
interface BakeryInterface {
public function createCookies();
public function createIceCream();
}
Bu, arabirimin çoğu uygulaması için işe yarar, ancak birkaç durumda bazı yeni işlevler eklemeliyim (belki de yeni bir yönteme eklenmiş gibi createBrownies()
). Bunu yapmak için aşikar / saf yaklaşım, arayüzü genişletmek olacaktır:
interface BrownieBakeryInterface extends BakeryInterface {
public function createBrownies();
}
Ancak, mevcut API'yi değiştirmeden yeni işlevleri ekleyememem konusunda oldukça büyük bir dezavantaj var (yeni arayüzü kullanmak için sınıfı değiştirmek gibi).
Örneklemeden sonra işlevselliği eklemek için bir adaptör kullanmayı düşünüyordum :
class BrownieAdapter {
private brownieBakery;
public function construct(BakeryInterface bakery) {
this->brownieBakery = bakery;
}
public function createBrownies() {
/* ... */
}
}
Hangi bana bir şey net olurdu:
bakery = new Bakery();
bakery = new BrownieBakery(bakery);
bakery->createBrownies();
Bu, soruna iyi bir çözüm gibi gözüküyor, ancak bunu yaparak eski tanrıları uyandırıp uyandırmadığımı merak ediyorum. Adaptör gitme yolu mu? İzlenecek daha iyi bir model var mı? Yoksa gerçekten sadece mermiyi ısırıyor ve orijinal arayüzü genişletiyor muyum?