Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in den Dekorationsmodus in C++-Entwurfsmustern

Eine kurze Einführung in den Dekorationsmodus in C++-Entwurfsmustern

黄舟
黄舟Original
2017-01-18 14:48:421148Durchsuche

Dekorationsmodus: Fügen Sie einem Objekt dynamisch einige zusätzliche Verantwortlichkeiten hinzu. In Bezug auf das Hinzufügen von Funktionalität ist der Dekorationsmodus flexibler als das Generieren von Unterklassen.

Vier Rollen des Dekorationsmodus:

Komponentenklasse: Component

Betonkomponentenklasse: ConereteComponent

Dekorationsklasse: Decorator (erweitert von der externen Klasse Component-Klasse Funktionen, es ist jedoch nicht erforderlich, dass Component die Existenz von Decorator kennt Beispiel zur Implementierung des Dekorationsmodus.

Testfall:


Implementierung des Dekorationsmodus:

[code]int main(){
    //初始化person(人)组件类Component,如果只有一个ConereteComponent类而不需要抽象的Component类,那么可以直接让Decorator继承具体的Component类。
    concretePerson *cp = new concretePerson("Jarrett");

    //初始化具体服饰类(装饰类Decorate)
    concreteTshirts *Tshirts = new concreteTshirts;
    concreteTrouser *Trouser = new concreteTrouser;
    concreteShoes *Shoe = new concreteShoes;
    //concreteSuit *Suit = new concreteSuit;
    concreteHat *Hat = new concreteHat;

    //依次进行装饰
    Tshirts->decorate(cp);
    Trouser->decorate(Tshirts);
    Shoe->decorate(Trouser);
    //Suit->decorate(Shoe);
    //显示结果
    Shoe->show();
    std::cout << std::endl;
    //再装饰一次查看效果
    Hat->decorate(Shoe);
    Hat->show();

    return 0;
}

[code]//主类
class concretePerson{
private:
    std::string name;//人名
public:
    concretePerson(){}
    concretePerson(std::string n):name(n){} //构造方式
    virtual void show()const{
        std::cout << name << "&#39;s dress: ";
    }
};

//服饰类(装饰类主类)
class Finery: public concretePerson{
protected:
    concretePerson *cPerson;//重点是维护一个主体类对象
public:
    void decorate(concretePerson *cp){
        cPerson = cp;
    }
    void show()const{
        if(cPerson != NULL)
            cPerson->show();
    }
};

//具体服饰类Tshirts
class concreteTshirts: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Tshirts ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteTrouser: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Trouser ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteShoes: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Shoe ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteSuit: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Suit ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteHat: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Hat ";  //用此来修饰
  }
};
Zusammenfassung:


Dekorationsmodus Es ist eine Möglichkeit, dynamisch weitere Funktionen zu vorhandenen Funktionen hinzuzufügen.

Wann sollte es verwendet werden?

Wenn die zu einem vorhandenen Programm hinzugefügten Funktionen nur die Anforderungen spezieller Verhaltensweisen erfüllen sollen, die nur unter bestimmten Umständen ausgeführt werden, erhöht das Hinzufügen von Code zur Hauptklasse die Komplexität der Hauptklasse. Zu diesem Zeitpunkt ist der Dekorationsmodus erforderlich, um jede zu dekorierende Funktion einer separaten Klasse zuzuordnen und diese Klasse das Objekt, das dekoriert werden soll, einzupacken.

Denn wenn ein besonderes Verhalten ausgeführt werden muss, kann der Clientcode selektiv Dekorationsfunktionen verwenden, um Objekte zur Laufzeit je nach Bedarf in der richtigen Reihenfolge zu verpacken.

Der Dekorationsmodus bedeutet, dass Sie Ihre eigene Hauptklasse und spezifische Klasse schreiben können, wie Sie möchten. Wenn ich zusätzliche Sonderfunktionen hinzufügen möchte, ist dies besser als das Generieren von Unterklassen Flexibel, der Code der ursprünglichen Hauptklasse und der konkreten Klasse muss nicht geändert werden.




Auf diese Weise kann die ursprüngliche Klasse vereinfacht werden, indem die dekorativen Funktionen in der Klasse aus der Hauptklasse verschoben und entfernt werden. Es trennt effektiv die Kernaufgaben und Dekorationsfunktionen der Klasse und kann wiederholte Dekorationslogik in verwandten Klassen entfernen.


Das Obige ist der Inhalt einer kurzen Einführung in den Dekorationsmodus von C++-Entwurfsmuster und mehr. Für verwandte Inhalte achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn