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

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++设计模式概述之装饰器的更多相关文章

  1. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  2. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  3. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  4. 设计模式のDecoratorPattern(装饰器模式)----结构模式

    一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  5. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  6. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  7. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  8. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  9. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

随机推荐

  1. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  2. 【Linux】非root安装Python3及其包管理

    1. Python 3.8.1安装 源码安装常规操作: wget -c https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz tar -xv ...

  3. C++类成员初始化列表的构造顺序

    看下面代码, 输出结果是多少呢? class A{ public: A(int k) : j(k), i(j) { } void show() { cout << this->i & ...

  4. python APScheduler模块

    简介 一般来说Celery是python可以执行定时任务, 但是不支持动态添加定时任务 (Django有插件可以动态添加), 而且对于不需要Celery的项目, 就会让项目变得过重. APSchedu ...

  5. hbase调优

    @ 目录 一.phoenix调优 1.建立索引超时,查询超时 2.预分区 hbase shell预分区 phoenix预分区 3.在创建表的时候指定salting. 4.二级索引 建立行键与列值的映射 ...

  6. 从零构建Java项目(Maven+SpringBoot+Git) #02 奥斯丁项目

    前两天我说要写个项目来持续迭代,有好多小伙伴都表示支持和鼓励,项目的第一篇这不就来了么~我给项目取了个名字,英文名叫做:austin,中文名叫做:奥斯丁 名字倒没有什么特别的含义,我单纯觉得这个名字好 ...

  7. linux 软链接与查看历史指令

    ln 说明 软连接也叫符号链接,类似于windows里的快捷方式,主要存放了路径. 基本语法 ln -s[原文件或目录][软连接名] 删除软链接 [root@hadoop102 ~]# rm -rf ...

  8. Javaj基础知识runtime error

    遇到的java 运行时错误: NullPointerException空指针  ,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始 ...

  9. linux基础-TCP/IP协议篇

    一.网络TCP/IP层次模型 1.网络层次模型概念介绍:TCP/IP协议就是用于简化OSI层次,以及相关的标准.传输控制协议(tcp/ip)族是相关国防部(DoD)所创建的,主要用来确保数据的完整性及 ...

  10. 建立资源的方法(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 终于,进入第5章资源计划编制了,所以就不能还在任务工作表里厮混了是吧,那就先进入资源工作表吧:[任务]>[甘特图]& ...