一、相关介绍
1、装饰模式是为已有功能动态地添加更多功能的一种方式。
2、举例:QQ中的服装秀可以动态的搭配不同的服饰来进行修饰。
3、UML图
4、所属类别:结构型
其实其实现就是在具体的装饰类构造过程的输入参数可以是people类,也可以是具体的装饰类,每次添加新装饰功能后,再调用输入参数类的功能。
二、C++程序实现
1 // 装饰模式应用.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 8 //定义一个纯基类 9 class Component 10 { 11 public: 12 Component(){} 13 virtual ~Component(){} 14 virtual void operate()=0; 15 }; 16 17 //定义两个需要被装饰的人people1和peopel2 18 class People1 :public Component 19 { 20 public: 21 People1(){} 22 virtual ~People1(){} 23 virtual void operate(){} 24 }; 25 class People2 :public Component 26 { 27 public: 28 People2(){} 29 virtual ~People2(){} 30 virtual void operate(){} 31 }; 32 //定义一个抽象的装饰类 33 class Decorator :public Component 34 { 35 public: 36 Decorator(Component *cc):ComponentObj(cc){} 37 //Decorator(Component *cc){}//考虑下如果使用这种构造方式而不是用ComponentObj,并且不对operate()任何操作会对结果产生什么影响 38 //Decorator(){}//考虑下如果使用这种构造方式会对具体的装饰类产生什么影响 39 virtual ~Decorator(){} 40 virtual void operate() 41 { 42 if(ComponentObj!=NULL) 43 { 44 ComponentObj->operate(); 45 } 46 } 47 protected: 48 Component *ComponentObj; 49 }; 50 //定义若干个具体的装饰类 51 class Tshirt:public Decorator 52 { 53 public: 54 Tshirt(Component *com) :Decorator(com){} 55 //构造Tshirt类的时候需要先构造它的基类Decorator 56 //而在Decorator类的构造函数Decorator(Component *cc):ComponentObj(cc){}中将输入的值先赋值给ComponentObj了 57 //将输入参数com复制给Decorator,是为了Decorator::operate(); 58 virtual ~Tshirt(){} 59 virtual void operate() 60 { 61 cout<<"Tshirt"<<endl; 62 Decorator::operate(); 63 } 64 }; 65 class Shoes:public Decorator 66 { 67 public: 68 Shoes(Component *com) :Decorator(com){} 69 virtual ~Shoes(){} 70 virtual void operate() 71 { 72 cout<<"Shoes"<<endl; 73 Decorator::operate(); 74 } 75 }; 76 class Suit:public Decorator 77 { 78 public: 79 Suit(Component *com) :Decorator(com){} 80 virtual ~Suit(){} 81 virtual void operate() 82 { 83 cout<<"Suit"<<endl; 84 Decorator::operate(); 85 } 86 }; 87 int _tmain(int argc, _TCHAR* argv[]) 88 { 89 //新建一个people1 90 People1 *p1=new People1(); 91 cout<<"Im people1"<<endl; 92 //给people1穿Tshirt、Suit 93 Tshirt *T1=new Tshirt(p1); 94 Suit *S1=new Suit(T1); 95 S1->operate(); 96 97 People2 *p2=new People2(); 98 cout<<"Im people2"<<endl; 99 //给people1穿Tshirt、Suit 100 Tshirt *T2=new Tshirt(p2); 101 Suit *S2=new Suit(T2); 102 Shoes *SH=new Shoes(S2); 103 SH->operate(); 104 105 return 0; 106 }