理解

使用两个隔离又继承自统一接口类的对象:方法对象(抽象/具体), 包装器对象(抽象/具体)实现多种组合只需要 n + m种实现, 而对比直接继承,则需要n*m 种实现,因此在面对多种具体类和多种额外装饰(额外的操作)时,装饰器模式比较有用,举例说明:

实现流的普通和加解密
n是流: 文件流,网络流,控制台流, m是普通和加密
如果用直接继承的方法处理,则需要实现的对象有文件流普通,文件流加密,网络流普通和网络流加密,,控制台流普通,控制台流加密, 一共是3*2 = 4
而用装饰器模式, 则只需要实现两种流,两种包装器,3+2 = 5 原因是因为装饰器模式使用运行时绑定

实现

方法类

class StreamBase{
virtual void io() = 0;
}; class FileStream:public StreamBase {
void io(){
// impletation
}
}; class SocketStream:public StreamBase {
void io(){
// impletation
}
}; class ConsoleStream:public StreamBase {
void io(){
// impletation
}
};

包装类

class DecoderBase: public StreamBase {
public
DecoderBase(StreamBase * ptr):m_functionbase(ptr){} void io(){
m_functionbase->io();
} private:
StreamBase* m_functionbase;
}; class NormalDecoder :public DecoderBase{
public:
NormalDecoder (StreamBase * ptr):DecoderBase(ptr){}
void io(){
DecoderBase::io();
normal();
} private:
void normal();
}; class EncodeDecoder :public DecoderBase{
public:
EncodeDecoder(StreamBase * ptr):DecoderBase(ptr){}
void io(){
DecoderBase::io();
encode();
} private:
void encode();
};

分析

包装器要继承方法接口的原因是统一接口。

包装器基类的作用是统一了数据,避免在每个基类里需要重复定义一个方法对象指针

总结

装饰器模式是比较有用的方法,比较灵活处理多变的情况,不过缺点是多重包装器比较复杂

c++ 装饰器模式/包装模式的更多相关文章

  1. python之路day11--装饰器形成的过程、作用、装饰器的固定模式

    装饰器形成的过程# 装饰器的作用# 原则:开放封闭原则#装饰器的固定模式 import time # print(time.time()) #1551251400.416998 当前时间() #让程序 ...

  2. Python 装饰器实现单列模式

    # 使用装饰器实现单列模式 def singleton(cls): # 用来存在实例的字典 singleton_instance = {} def wrapper(*args, **kwargs): ...

  3. OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式

    前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...

  4. JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  5. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  6. 20181122_C#中AOP初探_装饰器模式的AOP_Remoting实现AOP_Castle实现AOP

    一.   什么是AOP: a)         AOP是面向切面编程; 就像oop一样, 它也是一种编程思想; i.    Oop思想→一切皆对象, 对象交互组成功能, 功能叠加组成模块, 模块叠加组 ...

  7. 单列模式,装饰器、new方法、类/静态方法实现单列模式

    一.单列模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 C ...

  8. Python中的装饰器的使用及固定模式

    装饰器的使用: 在不想修改函数的调用方式,但是想给函数添加内容的功能的时候使用     为什么使用装饰器: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,引出 ...

  9. Python装饰器的解包装(unwrap)

    在Python 3.4 中,新增一个方法unwrap,用于将被装饰的函数,逐层进行解包装. inspect.unwrap(func, *, stop=None) unwrap方法接受两个参数:func ...

随机推荐

  1. AP架构基本过程

    ①.有线网络搭建(vlan,dhcp,路由等.) ②.ap零配置启动,通过dhcp获取IP地址及网关ip,同时获取ac ip地址. ③.AP主动建立到达ac的capwap隧道. ④.ap与ac建议隧道 ...

  2. Dubbo+Zookeeper 入门Demo

    1.Zookeeper安装及启动 可参考这篇文章https://www.cnblogs.com/geekdc/p/5948326.html 从下载到启动都描述的很详细,按照文章一步一步走即可. 2.D ...

  3. Java TCP发送与接收

    IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...

  4. Nginx系列p2:重载,热部署,日志分割

    今天我们来学习 nginx 的 重载.热部署.日志分割功能 重载:当我们需要修改配置文件中的一些值,我们可以直接修改该配置文件,然后重新启动 nginx 服务,就可以实现在 nginx 不停止服务的情 ...

  5. JSP变量、方法和类的声明,JSP程序片,JSP表达式

    参考文章 http://c.biancheng.net/view/1431.html http://c.biancheng.net/view/1433.html http://c.biancheng. ...

  6. 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)

    ios手机小程序调用wx.chooseLocation接口的时候,获取权限的时候报authorize:fail:require permission desc这样子的错误,这是由于苹果的安全机制导致需 ...

  7. CodeForces 366C 动态规划 转化背包思想

    这道题目昨晚比赛没做出来,昨晚隐约觉得就是个动态规划,但是没想到怎么DP,今天想了一下,突然有个点子,即局部最优子结构为 1-j,j<i,遍历i,每次从所有的1到j当中的最优解里面与当前商品进行 ...

  8. 小程序Java多次请求Session不变

    微信小程序每次请求的sessionid是变化的,导致对应后台的session不一致,无法获取之前保存在session中的openid和sessionKey. 为了解决这个问题,需要强制同意每次小程序前 ...

  9. tensorflow函数解析:Session.run和Tensor.eval

    原问题链接: http://stackoverflow.com/questions/33610685/in-tensorflow-what-is-the-difference-between-sess ...

  10. Charles 安装配置

    与Fiddler相比,Charles 对url的分类列表更为清晰,这一点是我更喜欢Charles的一点.当然在抓app包上,个人觉得使用Charles更得心应手,这一点可能仁者见仁智者见智. 下载 官 ...