2017-01-29 4 views
2

für ein Objekt Adapter Design, heißt es GoF:Adaptermuster: Warum sollten wir das Adpittee ableiten?

macht es schwieriger Adaptee Verhalten außer Kraft zu setzen. Es erfordert Subklassen Adaptee und Adapter machen auf die Unterklasse beziehen sich eher als die Adaptee selbst

Meine Frage ist, warum ist diese Subklassifizieren erforderlich ist, wenn wir die clases schaffen wie folgt:

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() ; 
} 

Ich habe Ich war nicht in der Lage, die von GoF geforderte Unterklassenbildung zu würdigen, wenn ich auch hier das Verhalten übersteuern kann.

Bitte erläutern Sie, was ich verpasse.

Antwort

2

Ich konnte die von GoF geforderte Unterklassenbildung nicht nachvollziehen, wenn ich auch hier das Verhalten übersteuern kann.

Ich sehe Ihre Verwirrung. Ihr Beispiel ist zu einfach, da es nur cout Anweisungen enthält. Ich würde nicht qualifizieren hinzufügen cout Anweisungen vor und nach einem Aufruf an eine der Adaptee s Methoden als Hinzufügen eines signifikanten Verhaltens. Sie müssen komplexere Szenarien in Betracht ziehen.

Stellen Sie sich vor, Sie möchten dem Adaptee, der die geschützten Daten von Adaptee verwendet, einige neue Funktionen hinzufügen. Sie können die Adaptee nicht ändern, so dass die einzige Option, die Sie haben, die Unterklasse ist.

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

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

Der obige Code zeigt einen komplexere Anwendungsfall der Funktionalität auf die Adaptee und Subklassifizieren Zugabe ist der einzige Weg, dies zu erreichen. Sie wollen nun diese neue Adaptee in Ihrer Adaptor verwenden. Wenn Sie mit der Objektadapter Option zu gehen, müssen Sie Dies hat die sofortige Ausgabe mit einer NewAdaptee Referenz in den Adaptor

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

starten, die Ihre Adaptor nicht mehr irgendwelche direkten Subklassen von Adaptee weitergegeben werden. Dies ist, was sie meinen, wenn sie sagen, Es wird Unterklasse Adaptee und machen Adapter beziehen sich auf die Unterklasse und nicht das Adpassee selbst. Dies würde den Vorteil des Objektadapters Ansatz wegnehmen, der es einem einzelnen Adapter ermöglichen sollte, mit allen Unterklassen von Adaptee zu arbeiten.

Hinweis: Im Klasse Adapter Ansatz würde NewAdaptee tatsächlich Ihr Adapter und auch Target erben würde.

Verwandte Themen