首页 > 代码库 > 设计模式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-装饰模式