案例:手机->贴膜->戴保护套->贴卡通贴纸->系手机挂绳

装饰模式

装饰模式定义(DecoratorPattern)

装饰模式是一种用于替代继承的技术。通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有对象的方法,还可以增加新的方法,以扩充原有类的功能。

组合模式和装饰模式

组合模式和装饰模式都可以用来透明的把对象包装在具有同样接口的另一个对象中。
组合模式和装饰模式都是结构型模式。组合模式着眼于把众多子对象组织为一个整体;装饰模式着眼于在不修改现有对象或从其派生子类的前提下为其增添职责,其子对象只有一个

装饰模式结构

  • Component(抽象构件):是具有构件类和装饰类的共同基类,声明了在具体构件中定义的方法,客户端可以一致的对待使用装饰前后的对象
  • ConcreteComponent(具体构件):具体构件定义了构件具体的方法,装饰类可以给它增加更多的功能
  • Decorator(抽象装饰类):用于给具体构件增加职责,但具体职责在其子类中实现。抽象装饰类通过聚合关系定义一个抽象构件的对象,通过该对象可以调用装饰之前构件的方法,并用过其子类扩展该方法,达到装饰的目的
  • ConcreteDecorator(具体装饰类):向构件增加新的功能

装饰模式示例

https://gitee.com/NiMiKiss/design-pattern.git

#ifndef _DECORATOR_PATTERN_
#define _DECORATOR_PATTERN_
#include<iostream>
class Component
{public:virtual void Operation() = 0;
};class Phone :public Component
{public:void Operation(){std::cout << "Phone" << std::endl;}
};class Decorator :public Component
{public:Decorator() {}Decorator(std::shared_ptr<Component> pComponent) :m_pComponent(pComponent) {}std::shared_ptr<Component> GetComponent()const{ return m_pComponent; }void SetComponent(std::shared_ptr<Component> pComponent) { m_pComponent = pComponent; }virtual void Operation() { m_pComponent->Operation(); }
private:std::shared_ptr<Component> m_pComponent;
};class DecoratorFilm :public Decorator
{public:DecoratorFilm() {}DecoratorFilm(std::shared_ptr<Component> pComponent) { SetComponent(pComponent); }void Operation() { GetComponent()->Operation(); NewBehavior(); }void NewBehavior() { std::cout << "贴膜" << std::endl; }
};class DecoratorShell :public Decorator
{public:DecoratorShell() {}DecoratorShell(std::shared_ptr<Component> pComponent) { SetComponent(pComponent); }void Operation() { GetComponent()->Operation(); NewBehavior(); }void NewBehavior() { std::cout << "戴保护套" << std::endl; }
};class DecoratorSticker :public Decorator
{public:DecoratorSticker() {}DecoratorSticker(std::shared_ptr<Component> pComponent) { SetComponent(pComponent); }void Operation() { GetComponent()->Operation(); NewBehavior(); }void NewBehavior() { std::cout << "贴卡通贴纸" << std::endl; }
};class DecoratorRope :public Decorator
{public:DecoratorRope() {}DecoratorRope(std::shared_ptr<Component> pComponent) { SetComponent(pComponent); }void Operation() { GetComponent()->Operation(); NewBehavior(); }void NewBehavior() { std::cout << "系手机挂绳" << std::endl; }
};#endif // !_DECORATOR_PATTERN_

客户端调用

#include"Decorator_Pattern.h"
#include<iostream>void Phone_1()
{std::cout << "手机1" << std::endl;auto spPhone_1 = std::shared_ptr<Phone>(new Phone());auto spDecoratorFilm_1 = std::shared_ptr<DecoratorFilm>(new DecoratorFilm(spPhone_1));auto spDecoratorShell_1 = std::shared_ptr<DecoratorShell>(new DecoratorShell(spDecoratorFilm_1));auto spDecoratorSticker_1 = std::shared_ptr<DecoratorSticker>(new DecoratorSticker(spDecoratorShell_1));auto spDecoratorRope_1 = std::shared_ptr<DecoratorRope>(new DecoratorRope(spDecoratorSticker_1));spDecoratorRope_1->Operation();
}void Phone_2()
{std::cout << "手机2" << std::endl;auto spPhone_2 = std::shared_ptr<Phone>(new Phone());auto spDecoratorFilm_2 = std::shared_ptr<DecoratorFilm>(new DecoratorFilm(spPhone_2));spDecoratorFilm_2->SetComponent(spPhone_2);auto spDecoratorShell_2 = std::shared_ptr<DecoratorShell>(new DecoratorShell());spDecoratorShell_2->SetComponent(spDecoratorFilm_2);auto spDecoratorSticker_2 = std::shared_ptr<DecoratorSticker>(new DecoratorSticker());spDecoratorSticker_2->SetComponent(spDecoratorShell_2);auto spDecoratorRope_2 = std::shared_ptr<DecoratorRope>(new DecoratorRope());spDecoratorRope_2->SetComponent(spDecoratorSticker_2);spDecoratorRope_2->Operation();
}int main()
{Phone_1();Phone_2();return EXIT_SUCCESS;
}

c++ 设计模式--装饰模式(04)相关推荐

  1. 设计模式----装饰模式

    设计模式--装饰模式 "装饰模式(Decorator)"又名"包装模式(Wrapper)",通常用来灵活地扩充对象的功能. 在此之前我们可以通过类的继承来扩充父 ...

  2. 大话设计模式-装饰模式(大鸟和小菜Java版)

    装饰模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.(百度百科) 这个模式让后期的修改变得极为简单,真的就高内 ...

  3. 大话设计模式—装饰模式

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

  4. 设计模式--装饰模式

    目录 什么是装饰模式? 应用代码示例 装饰模式模板 jdk中的装饰模式 为什么装饰器类不能直接实现Component父类? 什么是装饰模式? 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油 ...

  5. C++设计模式-装饰模式

    目录 基本概念 代码和实例 基本概念 装饰模式是为已有功能动态地添加更多功能的一种方式. 当系统需要新功能的时候,是向旧系统的类中添加新代码.这些新代码通常装饰了原有类的核心职责或主要行为. 装饰模式 ...

  6. 李建忠设计模式——装饰模式

    1."单一职责"模式 在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Deco ...

  7. C++设计模式——装饰模式(高屋建瓴)

    原网址:https://blog.csdn.net/CoderAldrich/article/details/83115394 重点在于 ConcreteDecoratorA(Component *d ...

  8. java设计模式——装饰模式

    装饰模式也称为包装模式.结构型设计模式之一,其使用一种对客户端透明的方式动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一. 装饰模式可以动态的给一个对象添加一些额外的职责.就增加功能功能来说 ...

  9. 设计模式——装饰模式详解

    0. 前言   写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇 ...

最新文章

  1. OSPF协议工作原理
  2. 计算机教学与课程论专业,东北师范大学专业介绍:计算机课程与教学论
  3. Linux - 简单设置 vim (tab, 行号, 换行)
  4. SharePoint Server和Office 365之间的混合模式集成概述
  5. 社交背水一战?校园日记背后,支付宝野心你真能懂?
  6. 利用js代码引入其他js文件到页面中
  7. ExtJS学习之路第三步:理解引擎之下,ExtJS4中的类
  8. 关于深度森林的一点理解
  9. 二分算法:数的三次方根
  10. css 图片放大1.2倍,什么是二倍图?怎样使用二倍图?
  11. 线程中常用的锁,有哪几种?
  12. 'Publishing' to tomcat v8.0 server at localhos... Tomcat 报错
  13. mmall 项目实战(一)项目初始化
  14. java 取一个数的各个位数
  15. Android项目实战--【谁是歌手-布局篇】
  16. SQL2008服务器连接失败
  17. Wattagio for Mac(Mac电池管理软件)v1.12.11
  18. 链式法则(chain rule)
  19. 实践是检验真理的唯一标准 - 脱壳篇02
  20. java网店系统_关于java网店系统的404页面 你知道多少

热门文章

  1. 今年的旅游特别晒:晒伤皮肤急救法
  2. 【MMDetection-学习记录】 Windows10操作系统下安装并运行
  3. 周末就是这么朴素无华且枯燥
  4. 股票交易数据采集+数据可视化(一个朴素无华的Python爬虫+可视化案例,附代全部代码)
  5. html做空白简历,第二天:给自己做一个在线简历吧-IFE
  6. Unity Multiple_Graph_And_Chart_UI_Pack 可视化UI插件
  7. 我的新书《Python3网络爬虫开发实战(第二版)》获得 Python 之父的推荐了!
  8. FreeForm和composite中插入子报表的区别
  9. linux网卡名字 mac,linux下编程如何获得所有网卡的信息-包括网卡名字,网卡MAC等等......
  10. CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析