装飾モード: 機能を追加するという点では、装飾モードはサブクラスを生成するよりも柔軟です。
デコレーションモードの4つの役割:
コンポーネントクラス:Component
特定コンポーネントクラス:ConereteComponent
Decorationクラス:Decorator(コンポーネントクラスの機能を外部クラスから拡張しますが、コンポーネントは必要ありません) )
具体的な装飾クラス: ConcreteDecorator (コンポーネントに責任を追加する機能)
ここでは、装飾モードを実装するために人の服装を例に挙げます。
テストケース:
[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 << "'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 "; //用此来修饰 } };
このように、クラス内の装飾関数をメインクラスから移動・削除することで、元のクラスを簡素化することができます。これにより、クラスの中核となる役割と装飾機能が効果的に分離され、関連するクラスで繰り返される装飾ロジックを削除できます。
上記は、C++ デザイン パターンの装飾モードの簡単な紹介の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) を参照してください。 !