일정량의 잘 정의 된 기능을 가진 인터페이스가 있습니다. 의 말을하자:
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();
이것은 문제에 대한 좋은 해결책처럼 보이지만, 그렇게함으로써 오래된 신들을 깨우고 있는지 궁금합니다. 어댑터가 갈 길입니까? 따라야 할 더 좋은 패턴이 있습니까? 아니면 정말 총알을 물고 원래 인터페이스를 확장해야합니까?