2017-01-29 8 views
2

Для проектирования объектного адаптера, GoF гласит:Шаблон адаптера: зачем нам нужно подклассировать Adaptee?

делает его труднее изменить поведение адаптируемый. Это потребует подклассов адаптируемый и сделать адаптер, обратитесь к подклассу, а не самого Adaptee

Мой вопрос заключается в том, что почему это подклассов требуется, когда мы создаем clases следующим образом:

class Target { 
    public : 
    virtual void op() = 0 ; 
} ; 

class Adaptee { 
    public : 
    void adapteeOp() {cout<<"adaptee op\n" ;} 
} ; 

class Adapter : public Target { 
    Adaptee *adaptee ; 
    public : 
    Adapter(Adaptee *a) : adaptee(a) {} 
    void op() { 
     // added behavior 
     cout<<"added behavior\n" ; 
     adaptee->adapteeOp() ; 
     // more added behavior 
     cout<<"more added behavior\n" ; 
    } 
} ; 

main() { //client 
    Adapter adapter(new Adaptee) ; 
    adapter.op() ; 
} 

У меня есть не смог оценить требования к подклассу, упомянутые GoF, когда я также могу переопределить поведение.

Пожалуйста, объясните, в чем суть, которую я пропускаю.

ответ

2

Я не смог оценить требование для подкласса, как указано GoF, когда я также могу переопределить поведение.

Я вижу ваше замешательство. Ваш пример слишком прост, так как он содержит только cout операторов. Я бы не квалифицировал добавление операторов cout до и после вызова одного из методов Adaptee как добавление какого-либо значимого поведения. Вам нужно рассмотреть более сложные сценарии.

Представьте, что вы хотите добавить некоторые новые функции в Adaptee, который использует защищенные данные от Adaptee. Вы не можете изменить Adaptee, поэтому единственный вариант, который у вас есть, - это подкласс.

class NewAdaptee : public Adaptee { 
    public : 
    void adapteeOp() { 
     cout<<"adaptee op\n" ; //step 3 
    } 

    void newFunctionality() { //use protected members from Adaptee } 
} ; 

Приведенный выше код демонстрирует более сложный случай использования добавления функциональности к Adaptee и подклассов является единственным способом для достижения этой цели. Итак, теперь вы хотите начать использовать этот новый Adaptee в своем Adaptor. Если вы идете с объекта опции адаптер, вам нужно будет начать использовать NewAdaptee ссылку в Adaptor

class Adapter : public Target { 
    NewAdaptee *adaptee ; 
    //more code follows 
} 

Это имеет непосредственный вопрос, что ваш Adaptor больше не могут быть переданы любые прямые подклассы Adaptee. Это то, что они имеют в виду, когда говорят . Для этого потребуется подкласс Adaptee и переход Adapter в подкласс, а не сам Adaptee. Это уберет преимущество объектного адаптера , который должен был позволить одному адаптеру работать со всеми подклассами Adaptee.

Примечание: В класса адаптера подхода, NewAdaptee фактически будет ваш адаптер, а также будет наследовать Target.