c++设计模式概述之装饰器
类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。
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、输出

c++设计模式概述之装饰器的更多相关文章
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- 设计模式学习心得<装饰器模式 Decorator>
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 设计模式のDecoratorPattern(装饰器模式)----结构模式
一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- 设计模式入门之装饰器模式Decorator
//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现
课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
随机推荐
- windows系统开/关机日志位置
邮件计算机=>管理 =>系统工具=>事件查看器=>Windows日志=>系统 过滤:关机:事件ID=6006 开机:事件ID=6005
- vector.erase();vector.clear();map.erase();
vector::erase()返回下一个iter: STL中的源码: //清除[first, last)中的所有元素 iterator erase(iterator first, iterator l ...
- Admixture的监督分群(Supervised analysis)
目录 说明 实战 说明 Admixture通过EM算法一般用于指定亚群分类:或者在不知材料群体结构背景下,通过迭代交叉验证获得error值,取最小error对应的K值为推荐亚群数目.如果我们预先已知群 ...
- [R] 保存pheatmap图片对象到文件
一般我们使用pheatmap通过Rstudio交互得到的图片在plots的Export导出即可,如何保存对象到文件呢?这个需求在自动化流程中很常见,作者似乎也没说明. 生成示例数据: test = m ...
- Oracle-判断一个表的一列是否在另一张表的一列存在
select * from A where exists(select 1 from B where A.a = B.b)
- C++面试基础篇(一)
1. static关键字的作用 (1)全局静态变量 在全局变量前面加上关键字static, 全局变量就定义为一个全局静态变量 在静态存储区,在整个程序运行期间一致存在. 初始化:未初始化的全局静态变量 ...
- Prometheus概述
Prometheus是什么 首先, Prometheus 是一款时序(time series) 数据库, 但他的功能却并非支部与 TSDB , 而是一款设计用于进行目标 (Target) 监控的关键组 ...
- Spark的shuffle和MapReduce的shuffle对比
目录 MapperReduce的shuffle Spark的shuffle 总结 MapperReduce的shuffle shuffle阶段划分 Map阶段和Reduce阶段 任务 MapTask和 ...
- set、multiset深度探索
set/multiset的底层是rb_tree,因此它有自动排序特性.set中的元素不允许重复必须独一无二,key与value值相同,multiset中的元素允许重复. set的模板参数key即为关键 ...
- Java Spring 自定义事件监听
ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; imp ...