设计模式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++虚函数表

原文地址:https://www.cnblogs.com/457220157-FTD/p/4013458.html