装饰者模式(Decorator)
时间:2022-04-26
本文章向大家介绍装饰者模式(Decorator),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
装饰者模式(Decorator)
装饰者模式(Decorator)[Wrapper]
意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。
应用:给GUI组件添加功能等。
模式结构:
心得:
装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口,这个统一的接口正是被装饰对象需要扩展功能的地方,因此它们需要一个共同的接口(AbstractComponent)。另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。注意装饰器对抽象接口的关系是一对一的,这和组合模式很像,但是一对一的关系决定了装饰器一次只能装饰一个对象,这种关系正是我们想要的。装饰器为被装饰对象添加功能通过调用被装饰对象的统一接口实现,如果装饰器需要复杂的扩展,我们通过继承装饰器实现具体的装饰器(ConcreteDecorator),具体的装饰器可以扩展数据(addedState),也可以扩展接口功能(addedBehavior)。
举例:
被装饰的对象假如是一块蛋糕,装饰器就是为蛋糕添加额外的属性,比如加上一朵花等。统一接口为了简单我们输出装饰后蛋糕的名字,那么装饰器的统一接口operation实现时就需要调用被装饰对象的operation,然后添加额外的名字。C++代码实现如下:
class AbstractComponent
{
public:
virtual string operation()=0;
virtual ~AbstractComponent(){}
};
class ConcreteComponent:public AbstractComponent
{
public:
virtual string operation()
{
return "基本对象";
}
};
class Decorator:public AbstractComponent
{
protected:
AbstractComponent*pAbsComponent;
public:
Decorator(AbstractComponent*pac):pAbsComponent(pac){}
virtual~Decorator()
{
delete pAbsComponent;
}
};
class ConcreteDecorator:public Decorator
{
public:
ConcreteDecorator(AbstractComponent*pac):Decorator(pac){}
virtual string operation()
{
string str="装饰后的";
str+=pAbsComponent->operation();
return str;
}
};
用户使用起来代码如下:
AbstractComponent*pac=
new ConcreteDecorator(
new ConcreteDecorator(
new ConcreteComponent()
));
cout<<pac->operation().c_str()<<endl;
delete pac;
从使用装饰者模式的代码来看,装饰器对对象的操作就像包装一样,一层层的为对象扩展功能,而且装饰器装饰后的对象仍然可以被装饰。
参考文章:http://www.iteye.com/topic/335521
- 多线程编程:多线程并发制单的开发记录【一】
- 如何使用线程锁来提高多线程并发效率
- 如何在分布式环境中同步solr索引库和缓存信息
- 如何在分布式环境中同步solr索引库和缓存信息
- Info模式下的隐形杀手(SpringMVC同时使用<mvc:resources.../>和FormattingConversionServiceFactoryBean时出现的问题)
- 关于web.xml3.0启动报错
- [机器学习]-[数据预处理]-中心化 缩放 KNN(一)
- 信息安全不可或缺应用交付 还需安全交付
- 一张图带你看懂区块链项目生态
- python环境的安装
- python爬虫抓取网易云音乐歌词
- 区块链学堂——“遇见”拜占庭将军
- NVIDIA把消费级显卡拒绝在数据中心门外
- 保护好手中的比特币,比特币诈骗又见新花样!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux低电量自动关机的实现方法
- ubuntn备份方法总结(四种)
- linux让程序开机自动运行最简单的方法
- centos克隆linux虚拟机的完整步骤分享
- CentOS7.4下MySQL5.7.28二进制方式安装的方法步骤
- centos6.5下安装zabbix2.4的教程图解
- linux虚拟机配置静态IP地址的完整步骤
- Linux下Mysql定时任务备份数据的实现方法
- Linux系统下快速配置HugePages的完整步骤
- 解决Linux Tensorflow2.0安装问题
- 工作中常用到的Linux命令总结
- Linux中把用户添加到组的4个方法总结
- Linux下配置jdk环境的方法
- Ubuntu 16.04/18.04 安装Pycharm及Ipython的教程
- linux系统对外开放3306、8080等端口,防火墙设置详解