博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式3-装饰模式
阅读量:6617 次
发布时间:2019-06-25

本文共 1987 字,大约阅读时间需要 6 分钟。

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

 

运用场景:

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

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

 

UML图

 

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

 

我的装饰模式代码

1 #include 
2 #include
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”。这就是对类虚函数的使用,不明白的也可以再研读下我写的 

转载于:https://www.cnblogs.com/457220157-FTD/p/4013458.html

你可能感兴趣的文章
SpringBoot权限控制
查看>>
阿里云中间件技术 促进互联网高速发展
查看>>
智能时代悄然到来 物联网称王将引爆传感器产业
查看>>
物理隔离计算机被USB蜜蜂刺破 数据通过无线信号泄露
查看>>
利用一点机器学习来加速你的网站
查看>>
中国域名现状:应用水平较低,安全仍存隐患
查看>>
Java中HashMap的原理分析
查看>>
React Native入门项目与解析
查看>>
云计算:大势所趋 你准备好了么?
查看>>
数据资产的运营商--天市大数据交易平台
查看>>
中小企业如何成功转型跨境电商
查看>>
java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**
查看>>
《ANTLR 4权威指南》——2.5 语法分析树监听器和访问器
查看>>
02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译...
查看>>
这些国货,在阿里平台上被美国剁手党抢疯了
查看>>
《Excel 职场手册:260招菜鸟变达人》一第 2 招 常用快捷键Windows与Mac对照
查看>>
《Greenplum企业应用实战》一第1章 Greenplum简介1.1 Greenplum的起源和发展历程
查看>>
开源世界已成围城:成本让企业蜂拥而来,也让企业退缩转投
查看>>
《Python编程快速上手——让繁琐工作自动化》——1.4 在变量中保存值
查看>>
想改进你的卷积神经网络?看看这14种设计模式!
查看>>