一、相关介绍
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 }