首页 > 代码库 > 设计模式3-装饰模式

设计模式3-装饰模式

最近一直没有更新设计模式,一方面是因为国庆几天搬了几天家,没时间看书,另外一方面就是我对于实例之间的关系不怎么明白。昨天忽然对虚函数表有了兴趣,就研读了一下,然后再来看这个装饰模式,就理解这个模式是怎么运行起来的了。

 

运用场景:

1.在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,动态地给一个对象添加一些额外的职责。

2.类设计的对扩展开放,对修改关闭。

 

UML图

 

说说我对这个UML图的理解:Componet是个总的抽象类,左侧的ConcreateComponent是我们具体的要装饰的对象,右侧的Decorator是具体的装饰品。举个例子,我有两个手机,MX3 和 IPhone5s,我都对这两个手机进行了装饰(贴膜、加了个挂饰),那么Component指的就是Phone,ConcreateComponent指的就是MX3和IPone5s,那么装饰指的就是Decorator,贴膜和加挂饰指的就是ConcreateDecorator。

 

我的装饰模式代码

  1 #include <iostream>  2 #include <string>  3 using namespace std;  4   5 class Person {  6 public:  7     Person() {}  8     Person(string n):name(n) {}  9     virtual ~Person() {} 10     virtual void Show(){ cout << name << endl;} 11 private: 12     string name; 13 }; 14  15 class Finery : public Person { 16 public: 17     Finery(Person *p): p_person(p) {} 18     virtual ~Finery() {} 19     virtual void Show() { 20         p_person->Show(); 21     } 22 private: 23     Person *p_person; 24 }; 25  26 class Shirt : public Finery { 27 public: 28     Shirt(Person* p) : Finery(p) {} 29     virtual ~Shirt() {} 30     virtual void Show() { 31         cout << "Shirt " << endl; 32         Finery::Show(); 33     } 34 }; 35  36  37 class Tie : public Finery { 38 public: 39     Tie(Person* p) : Finery(p) {} 40     virtual ~Tie() {} 41     virtual void Show() { 42         cout << "Tie " << endl; 43         Finery::Show(); 44     } 45 }; 46  47 int main() 48 { 49     Person *p_person = new Person("Jack"); 50     Shirt *p_shirt = new Shirt(p_person); 51     Tie *p_tie = new Tie(p_shirt); 52     p_tie->Show(); 53     delete p_tie; 54     delete p_shirt; 55     delete p_person; 56 }

 

这里说说代码是怎么运行起来的,

第52行调用p_tie的Show()函数,打印出“Tie”,接着发现调用了父类(Finery)的Show()函数;回到代码20行,发现p_person的实例是shirt的,通过虚函数调用的是真正的对象shirt的Show()函数,打印出“Shirt”;接着又发现调用父类(Finery)的Show()函数,回到代码20行,发现p_person的实例是Jack,通过虚函数调用的真正的对象Person的Show()函数,打印出“Jack”。这就是对类虚函数的使用,不明白的也可以再研读下我写的 我理解的C++虚函数表

设计模式3-装饰模式