用途
装饰者模式 (Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。
装饰者模式是一种结构式模式。
结构
aaarticlea/png;base64,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" alt="" />
图-装饰者模式结构图
Component : 定义一个对象接口,可以给这些对象动态地添加职责。
interface Component {
public void operation();
}
ConcreteComponent : 实现 Component 定义的接口。
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("初始行为");
}
}
Decorator : 装饰抽象类,继承了 Component, 从外类来扩展 Component 类的功能,但对于 Component 来说,是无需知道 Decorator 的存在的。
class Decorator implements Component {
// 持有一个 Component 对象,和 Component 形成聚合关系
protected Component component;
// 传入要进一步修饰的对象
public Decorator(Component component) {
this.component = component;
}
@Override
// 调用要修饰对象的原方法
public void operation() {
component.operation();
}
}
ConcreteDecorator : 具体的装饰对象,起到给 Component 添加职责的功能。
class ConcreteDecoratorA extends Decorator {
private String addedState = "新属性1";
public ConcreteDecoratorA(Component component) {
super(component);
}
public void operation() {
super.operation();
System.out.println("添加属性: " + addedState);
}
}
class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
public void operation() {
super.operation();
AddedBehavior();
}
public void AddedBehavior() {
System.out.println("添加行为");
}
}
测试代码
public class DecoratorPattern {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component.operation();
System.out.println("======================================");
Decorator decoratorA = new ConcreteDecoratorA(component);
decoratorA.operation();
System.out.println("======================================");
Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
decoratorB.operation();
}
}
运行结果
初始行为
======================================
初始行为
添加属性: 新属性1
======================================
初始行为
添加属性: 新属性1
添加行为
应用场景
1、需要动态的、透明的为一个对象添加职责,即不影响其他对象。
2、需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
要点
1、装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
2、装饰对象包含一个真实对象的引用(reference)。
3、装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
4、装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
推荐
本文属于 JAVA设计模式系列 。
参考资料
《大话设计模式》
《HeadFirst设计模式》
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- 【设计模式】Java设计模式 - 装饰者模式
Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...
- Java 设计模式—装饰者模式
在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...
- Java设计模式の装饰者模式
目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...
- Java设计模式--装饰器模式到Java IO 流
装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...
- JAVA设计模式---装饰者模式
写在前面的话: 该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案.装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的 ...
- 设计模式-装饰者模式(Decorator Pattern)
本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...
- markdown语法记录
换行:在结尾加两个空格后回车. 缩进:将输入法切换到全角,两个空格就是两个汉字的大小.
- vc编译 zlib 1.2.8
最近用到gzip关的算法,于是想起了zlib这个库,于是将其下载下来编译. 首先,在官网上下载源码包:http://zlib.net/zlib-1.2.8.tar.gz 解压之后,打开vc 命令工具: ...
- 软件工程课设day3
下载昨日新版本程序,完成修复项目的测试. 与组内成员讨论,确认项目新模块功能“吐槽墙”的设计方向与实现形式——因为项目为便捷工具类,社区形式的实现方式与项目本质背道而驰.因此决定以“点击目标课程条目, ...
- UWP应用开发系列视频教程简介 - Built for Windows 10
万分感谢Fdyo同学给我们带来的有中文字幕的系列教程! http://zhuanlan.zhihu.com/MSFaith/20364660 下面是这系列video教程中的一个截图作为示例,有代码,有 ...
- Ubuntu下解决adb devices:???????????? no permissions的方法
之前一直都是在windows下进行开发的,但是这次由于一个小模块用的东西只能在linux下运行,所以就发生了这么一系列的问题环境:虚拟机Vmware下的Ubuntu12.10事件:连接android手 ...
- 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制
回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...
- 前端那点事儿——Tocify自动生成文档目录
今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目录的焦点. 效果 框架 原来使用的是一个开源的jquery-ui控件——tocify.js,它可以遍历页面 ...
- JS 脚本最后加载
有些脚本执行,为了不影响页面其他脚本执行,需要放在最后 <script type="text/javascript"> function addLoadEvent(fu ...
- Struts2常量的具体用法实例
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 --> <constant name=" ...
- 用Chrome插件对自动化测试TestWriter进行录制
1.打开Chrome浏览器,在浏览地址中输入: chrome://extensions/,并勾选开发者模式.如图: 2.点击按钮[加载已解压的扩展程序-].如图: 3.选择Testwriter客户端下 ...