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

  • 相关阅读:
    CentOS系统下NFS服务器
    网络封包分析
    Android端抓包方法
    SQL Server 2008从基础开始学习的历程(1)------创建表与查询
    序--CentOS6.5 mini 安装和基本配置
    MonkeyRunner(猴哥快跑)常用类方法总结
    python 开源数据抓取框架scrapy
    pycharm最新版注册
    python flask下传数据到js
    centos打架django + mysql环境
  • 原文地址:https://www.cnblogs.com/457220157-FTD/p/4013458.html
Copyright © 2020-2023  润新知