У мене є інтерфейс, який має певну кількість чітко визначених функціональних можливостей. Скажімо:
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();
Це здається гарним рішенням проблеми, але мені цікаво, чи пробуджую я старих богів, роблячи це. Чи потрібний адаптер? Чи є краща модель, яку слід дотримуватися? Або я повинен просто просто кусати кулю і просто розширювати оригінальний інтерфейс?