设计模式(Java随笔)—装饰模式
装饰模式(Decorator Pattern):为已有功能动态地添加更多功能的一种方式
Attach additional responsiblities to an object dynamically keeping the same interface. Decorator provide a flexible alternative to subclassing for extending functionality.
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的四个角色:
抽象构件(Component)角色:规范需要装饰的对象(原始对象)
具体构件(Concrete Component)角色:实现抽象构件接口,定义一个需要装饰的原始类
抽象装饰(Decorator)角色:定义一个与抽象构件接口一致的接口,并拥有一个构件对象的实例
具体装饰(Concrete Decorator)角色:实现抽象装饰接口,负责对构建对象进行装饰
装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象。
装饰模式把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责与装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
基本代码实现:
public class DecoratorModel {
/**
* 装饰模式
*/
public static void main(String[] args) {
//1、创建具体构建对象
ConcreteComponent component=new ConcreteComponent();
//2、用装饰A对对象进行包装
ConcreteDecoratorA decoratorA=new ConcreteDecoratorA(component);
//3、在装饰A的基础上用装饰B对对象进行包装
ConcreteDecoratorB decoratorB=new ConcreteDecoratorB(decoratorA);
//4、开始装饰
decoratorB.operation(www.dfgjpt.com/);
}
}
//抽象构建角色
interface Component{
public void operation();
}
//具体构建角色
class ConcreteComponent implements Component{
@Override
public void operation() {
//初始业务代码
System.out.println("具体角色的初始构建");
}
}
//抽象装饰角色
abstract class Decorator implements Component{
private Component component=null;
public Decorator(www.leyou2.net Component component){
this.component=component;
}
public void operation(www.thd540.com){
this.component.operation(www.zhongdayule.cn);
}
}
//具体装饰角色A
class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
//定义新增的操作
private void addOper(){
System.out.println("具体角色的A装饰");
}
//重写operation方法
public void operation(){
super.operation();//先对对象进行初始化构建
this.addOper();
}
}
//具体装饰角色B
class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Component component) {
super(component);
}
//定义新增的操作
private void addOper(){
System.out.println("具体角色的B装饰");
}
//重写operation方法
public void operation(){
super.operation();//先对对象进行初始化构建
this.addOper();
}
}
运行结果:
具体角色的初始构建
具体角色的A装饰
具体角色的B装饰
在Java.io包中,很多类的设计,都用到了装饰器模式(如Reader相当于抽象的被装饰者,FileReader相当于具体的被装饰者,BufferedReader相当于装饰)。
设计模式(Java随笔)—装饰模式的更多相关文章
- 【视频】设计模式(Java)视频讲解
设计模式(JAVA) 视频网址: http://www.qghkt.com/ 设计模式(JAVA)视频地址: https://ke.qq.com/course/318643?tuin=a508ea62 ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- 《Java设计模式》之装饰模式
装饰模式(Decorator) 1. 装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2. ...
- 《JAVA设计模式》之装饰模式(Decorator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...
- java设计模式-----7、装饰模式
首先,什么是装饰者模式呢??? 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator ...
- Java描述设计模式(09):装饰模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领.他变成鱼儿时,就可以到水里游泳:他变成鸟儿时,就可以 ...
- java常用设计模式七:装饰模式
一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...
- Java之装饰模式
1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...
- 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- HTML_2
html图像 <img>标签可以在网页上插入一张图片,它是独立使用的标签,通过‘src’属性定义图片的地址(可为绝对路径也可为相对路径),通过‘alt’属性定义图片加载时显示的文字,以及对 ...
- SQL Server将列以分隔符分割后存到临时表
begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...
- CPP-基础:虚函数表
虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表 ...
- javaweb基础(13)_session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
- Bootstrap历练实例:带表格的面板
带表格的面板 为了在面板中创建一个无边框的表格,我们可以在面板中使用 class .table.假设有个 <div> 包含 .panel-body,我们可以向表格的顶部添加额外的边框用来分 ...
- ssh整合思想 Spring与Hibernate的整合ssh整合相关JAR包下载 .MySQLDialect方言解决无法服务器启动自动update创建表问题
除之前的Spring相关包,还有structs2包外,还需要Hibernate的相关包 首先,Spring整合其他持久化层框架的JAR包 spring-orm-4.2.4.RELEASE.jar ( ...
- CentOS 编译安装PHP5.6(7以上也通用)
由于公司有新服务器需要构建一套LNMP平台,且需要编译安装各个部件,所以记录下此文章. 这是安装PHP涉及到的软件包(可以自行决定使用哪个版本): ├── libiconv-1.15.tar.gz ├ ...
- SAP行列转换的一种方法
一段经典的代码写在这里 TABLES spfli. DATA: lt_data TYPE STANDARD TABLE OF spfli, lwa_ref TYPE REF TO data, lt_f ...
- linux中怎样关闭ICMP回应功能
引用自:http://blog.csdn.net/qq844352155/article/details/49700121 linux中怎样关闭ICMP回应功能 输入: echo 1 > ...
- JQuery 在线编辑器和手册
JQuery 在线编辑器 JQuery 在线编辑器 JQuery 菜鸟教程 手册 JQuery 菜鸟教程 手册