装饰模式(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随笔)—装饰模式的更多相关文章

  1. 【视频】设计模式(Java)视频讲解

    设计模式(JAVA) 视频网址: http://www.qghkt.com/ 设计模式(JAVA)视频地址: https://ke.qq.com/course/318643?tuin=a508ea62 ...

  2. Java设计模式学习记录-装饰模式

    前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...

  3. 《Java设计模式》之装饰模式

    装饰模式(Decorator) 1.    装饰模式(Decorator)的定义:又名包装(Wrapper)模式.装饰模式以对client透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.   ...

  4. 《JAVA设计模式》之装饰模式(Decorator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  5. java设计模式-----7、装饰模式

    首先,什么是装饰者模式呢??? 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator ...

  6. Java描述设计模式(09):装饰模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领.他变成鱼儿时,就可以到水里游泳:他变成鸟儿时,就可以 ...

  7. java常用设计模式七:装饰模式

    一.概念 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为. 基本角色: 抽象构件:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的 ...

  8. Java之装饰模式

    1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...

  9. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. JAVA图形界面常用知识点总会《代码分析》

    1. package CLASS16.bin.com.GridLayout; import javax.swing.ImageIcon;import javax.swing.JFrame;import ...

  2. coreData-Fetching Managed Objects

    https://developer.apple.com/library/content/documentation/DataManagement/Conceptual/CoreDataSnippets ...

  3. 使用Timer组件实现倒计时

    实现效果: 知识运用:  Timer组件的Enabed属性 实现代码: private void timer1_Tick(object sender, EventArgs e) { DateTime ...

  4. jfinal的配置文件详解

    1.去官网下载最新的jar包(我这是JFinal-lib-2.2) tomcat+mysql 所需要的jar 2.配置web.xml <filter> <filter-name> ...

  5. Spring学习笔记之Spring概述

    概述   Spring是一个java应用最广的开源框架,它是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...

  6. 《effective c++》问题总结

    04 确定对象被使用前已先被初始化 1.static/heap/stack对象 2.trivial对象 3.模板隐式具现化 implicit template instantiations 4.Sin ...

  7. OI算法复习汇总

    各大排序 图论: spfa floyd dijkstra *拉普拉斯矩阵 hash表 拓扑排序 哈夫曼算法 匈牙利算法 分块法 二分法 费马小定理: a^(p-1) ≡1(mod p) 网络流 二分图 ...

  8. 二叉搜索树详解(Java实现)

    1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...

  9. node 文件下载到本地 (支持中文文件名)

    downloadfile:function(req,res,next){ var name= encodeURI(req.query.name); var path= req.query.url; v ...

  10. hibernate简介以及简单配置

    Hibernate简介: Hibernate是一个开源对象关联关系映射的框架,他对JDBC做了轻量级的封装,使我们可以通过面向对象的思想操作数据库. 为什么要用Hibernate: 1: 对JDBC访 ...