c++设计模式概述之装饰器
2024-09-07 00:16:45
类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。
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、输出
最新文章
- 谈一谈前端多容器(多webview平台)处理方案
- c++11的右值引用、移动语义
- Excel中提取最大值的问题
- OAF_文件系列11_实现OAF读写Excel包JXL和POI的区别(概念)
- python第二十天-----Django补充
- jquery时间轴幻灯展示源代码
- JavaScript作用域学习笔记
- 各大网站CSS代码初始化集合
- jmeter 实时搜索结果
- 纯CSS3大转盘抽奖(响应式、可配置)
- 试读《JavaScript语言精髓与编程实践》
- 谈数据库索引和Sqlite中索引的使用
- 最简单的CRC32源码---逐BIT法
- Javascript:charCodeAt()方法及示例
- windows下使用waveout函数族播放wav文件
- 数据转换失败 java.math.BigDecimal cannot be cast to java.lang.String
- Linux c codeblock的使用(一):新建一个工程
- test--1
- LinkedBlockingQueue中put源码分析
- 20165326 java实验四