类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。 

1、概述

  想象一下修房子。当施工队把房子框架结构做好了,墙刷上了水泥, 这时,工队暂时没有钱,装修只能暂停了。 过了一段时间,工队筹集了资金,继续装修,最后交给用户。

  这个过程中, 就和 装饰器模式 很接近。 工队前期,做好了房屋结构框架,刷上了水泥, 好比现有的类,这时,需要对其进行扩展,就好比房屋的后期装修。装饰器模式就和这个道理是一样的。

  下面示例

2、房屋基类

// 房子基类
class house
{
public:
virtual void get_info() = 0;
};

3、毛坯房刷上了水泥

// 拿到毛坯房,都是水泥墙,还没有装修
class house_my : public house
{
public:
// 毛坯房拿到了,输出基本信息
void get_info()
{
cout << "毛坯房拿到了,都是水泥墙,还没有装修\n";
}
};

4、工队筹集了资金,准备i装修,装修时建立在现有的水泥房之上

// 定义一个抽象的装修类,目的是为了保留现有对象的接口和属性
class house_decorator : public house
{
public: // 初始化原有对象
void init(house *pinstance)
{
if (nullptr != pinstance)
_phouse = pinstance;
} // 为了输出原始对象的接口
void get_info()
{
if (_phouse)
_phouse->get_info();
} private:
// 保存原始接口
house *_phouse = nullptr;
};

5、装修计划已经做好,下面开始装修

// 现在开始装修了,当然是基于原始的毛坯房
class house_decorator_my : public house_decorator
{
public:
// 装修是建立在毛坯房的基础上
void init2(house *pinstance)
{
if (nullptr != pinstance)
init(pinstance);
} // 厨房装修好了
void get_kitchen_info()
{
cout << "\n 厨房装修好了\n";
} void get_drawing_room_info()
{
cout << "\n 客厅装修好了 \n";
}
};

6、房屋装修好了,来看看结果:(装饰器类调用)

// 尝试调用房子装修结果
void call_house_mode()
{
// 1、先拿到毛坯房
std::unique_ptr<house> phouse(new(std::nothrow) house_my);
if (!phouse)
{
cout << "\n 毛坯房 还没有修好\n";
return;
} // 2、 输出毛坯房信息
cout << "\n 毛坯房结果:";
phouse->get_info(); // 3、 创建装修工具
std::unique_ptr<house_decorator_my> phouse_decorator_my(new(std::nothrow) house_decorator_my); if (!phouse_decorator_my)
{
cout << "\n 房子还没装修好,再等等 \n";
return;
} cout << "\n \n\n\n 毛坯房装修完了,结果:\n"; // 初始化毛坯房
phouse_decorator_my->init(phouse.get()); // 看看装修结果
phouse_decorator_my->get_info();
phouse_decorator_my->get_drawing_room_info();
phouse_decorator_my->get_kitchen_info();
}

7、输出

最新文章

  1. 谈一谈前端多容器(多webview平台)处理方案
  2. c++11的右值引用、移动语义
  3. Excel中提取最大值的问题
  4. OAF_文件系列11_实现OAF读写Excel包JXL和POI的区别(概念)
  5. python第二十天-----Django补充
  6. jquery时间轴幻灯展示源代码
  7. JavaScript作用域学习笔记
  8. 各大网站CSS代码初始化集合
  9. jmeter 实时搜索结果
  10. 纯CSS3大转盘抽奖(响应式、可配置)
  11. 试读《JavaScript语言精髓与编程实践》
  12. 谈数据库索引和Sqlite中索引的使用
  13. 最简单的CRC32源码---逐BIT法
  14. Javascript:charCodeAt()方法及示例
  15. windows下使用waveout函数族播放wav文件
  16. 数据转换失败 java.math.BigDecimal cannot be cast to java.lang.String
  17. Linux c codeblock的使用(一):新建一个工程
  18. test--1
  19. LinkedBlockingQueue中put源码分析
  20. 20165326 java实验四

热门文章

  1. 自然溢出哈希 hack 方法
  2. C语言 fastq文件转换为fasta文件
  3. 34. Swap Nodes in Pairs
  4. 02 Windows安装C语言开发工具CodeBlocks
  5. 简化版chmod
  6. Linux基础命令---mysqlshow显示数据库
  7. oracle 当月日历的sql
  8. HTML样式 背景
  9. 【编程思想】【设计模式】【结构模式Structural】装饰模式decorator
  10. 【编程思想】【设计模式】【结构模式Structural】组合模式composite