博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-装饰模式(08)
阅读量:6325 次
发布时间:2019-06-22

本文共 2054 字,大约阅读时间需要 6 分钟。

定义

  装饰模式的英文原话是:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclass for extending functionality.意思是:动态的给一个对象添加一些额外的职责。就增强功能来说,装饰模式相比于代理模式生成子类更为灵活。

  装饰模式有四种角色:

  抽象构建(Component)角色:该角色用于规范需要装饰的对象(原始对象)。

  具体构建(Concrete Component)角色:该角色实现抽象构件接口,定义一个需要装饰的原始类。

  装饰角色(Decorator)角色:该角色持有一个构建对象的实例,并定义一个与抽象构建接口一致的接口。

  具体装饰模式(Concrete Decorator)角色:该角色负责对构建对象进行装饰。

/** * 抽象构建 * 原始对象接口 */public interface Component {    public void operation();}/** * 具体构建 * 原始对象类 */public class ConcreteComponent implements Component{    @Override    public void operation() {        //业务代码        System.out.println("原始对象业务代码");    }}/** * 装饰类角色 * 抽象类 */public abstract class Decorator implements Component {    private Component component = null;    public Decorator(Component component) {        this.component = component;    }    @Override    public void operation() {        this.component.operation();    }}/** * 具体修饰 */public class ConcreteDecorator extends Decorator {    public ConcreteDecorator(Component component) {        super(component);    }        //装饰类添加的方法    private void addmethod(){        System.out.println("Decorator添加的方法");    }    //重写operation方法    public void operation(){        this.addmethod();        super.operation();    }}//调用public class DecoratorDemo {    public static void main(String[] args) {        Component component = new ConcreteComponent();        component.operation();        System.out.println("经过装饰----------");        component = new ConcreteDecorator(component);        component.operation();    }}

装饰模式的优点

  • 装饰类和被装饰类可以独立发展,而不会相互耦合,即Component类无须知道Decorator类,Decorator类从外部扩展Component类的功能,而Decorator不用知道具体的构建。
  • 装饰模式是继承关系的一个替代方案。装饰类Decorator不管装饰多少层,返回的对象还是Component。
  • 装饰模式可以动态地扩展一个实现类的功能。

装饰模式的缺点

  多层的装饰比较复杂

装饰模式使用场景

  • 需要扩展一个类的功能,或给一个类增加附加功能。
  • 需要动态地给一个对象增加功能,这些功能可以动态地撤销。
  • 需要为一批类进行改装或加装功能。

  装饰模式是对继承的有效补充。单纯使用继承时,在某些情况下回增加很多子类,而且灵活性差,也不容易维护。装饰模式可以替代继承,解决类膨胀的问题,如java基础类库中的与输入输出流相关的类大量使用了装饰模式。

转载于:https://www.cnblogs.com/aeolian/p/7887251.html

你可能感兴趣的文章
微信公众号特异功能列表
查看>>
36.Node.js 工具模块--OS模块系统操作
查看>>
Python之cv2
查看>>
函数的泛型约束是函数签名的一部分,不符合约束的初始调用将不能查找到函数(报错)...
查看>>
《Android学习指南》分享给大家
查看>>
WayOs 各个版本:包括完美破解版、内置重启版、内置免拉黑、OEM
查看>>
浏览器内核及渲染过程介绍
查看>>
clear .svn folder use bat
查看>>
c++ 类 总结
查看>>
java日期转字符串 字符串转日期 日期转日历 日历转日期
查看>>
hdu 2413(最大匹配+二分)
查看>>
ASP.NET Cookie概念、CURD操作、原理、实际运用
查看>>
vc++ 判断文件或是文件夹是否存在,比较好的做法
查看>>
(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
查看>>
CentOS7 iso封装语句
查看>>
Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项...
查看>>
Https 公钥、私钥、证书
查看>>
javacsript Numnber 对象
查看>>
MOS管基本构造和工作原理
查看>>
RocketMQ原理解析-Broker
查看>>