打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
设计模式-装饰模式学习笔记

装饰模式(结构型模式)

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP]

 

自己的理解在不对原有类进行修改的情况下动态的对它进行扩展一些功能 


 

  • 优缺点

优点:

  1. 满足开闭原则
  2. 能够动态的增删功能,比继承更灵活

缺点:

  1. 会多出很多小类,增加了程序的复杂性
  2. 难以排错(多级装饰的对象,排错需要逐级排查)

 

  • 特点
  1. 装饰对象和被装饰对象有共同的父类
  2. 装饰对象持有一个被装饰对象的实例(体现为拥有一个属性是父接口的对象)
  3. 装饰对象对调用方传过来的请求会转发给被装饰对象(体现为所有的子装饰类在操作时都会调用装饰类的方法,而装饰类会通过调用父接口对象的方法去调用被装饰对象的方法)
  4. 子装饰类在调用装饰对象的方法时会新增其他一些附加功能(装饰模式的意义)

 

 

  • 结构

Component:装饰对象和被装饰对象的共同父类

ConcreteComponent:被装饰类,也为具体实现类

Decorator:装饰类,自装饰类的父类

ConcreteDecoratorA:子装饰类,提供特定的装饰

ConcreteDecoratorB:子装饰类,提供特定的装饰

更多的ConcreteDecorator(C,D,E,F)


 

  • 代码

例子:武装机甲,一台机甲,没有任何装备,现在需要给机甲装上各种装备,机甲是被装饰对象,给机甲新增装备为装饰类,动态的添加武器装备和防具装备

       被装饰对象与装饰对象的共同父类

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:02 * @ Description:装饰对象和被装饰对象的共同父类 */public interface Component {     void operation();}

  被装饰对象,拥有完整的操作

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:06 * @ Description:被装饰者对象   机甲类 */public class ConcreteComponent implements Component{    @Override    public void operation() {        System.out.println("末日机甲前来报道,装备:");    }}

  装饰类,持有一个被装饰对象的引用,并且在被调用时,调用被装饰对象的方法

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:09 * @ Description:装饰类   */public abstract class Decorator implements Component {    //持有一个被装饰对象的引用    private Component component;    public void setComponent(Component component) {        this.component = component;    }    @Override    public void operation() {        if(component != null){            component.operation();        }    }}

  子装饰类,在调用提供特定的装饰操作时,调用父类方法

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:18 * @ Description:具体装饰类  机甲装备武器改装类 */public class ConcreteDecoratorA extends Decorator{    @Override    public void operation() {        super.operation();        System.out.println("改装:等离子高频激光剑");    }} 

  同上

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:28 * @ Description:具体装饰类  机甲装备防具改装类 */public class ConcreteDecoratorB extends Decorator{    @Override    public void operation() {        super.operation();        System.out.println("改装:全适应立场防护盾");    }}

        客户端调用类

/** * @ Author     :fonxi * @ Date       :2019/5/13 3:00 * @ Description:客户端调用类 */public class TestController {    public void print(){        ConcreteComponent concreteComponent = new ConcreteComponent();        ConcreteDecoratorA cA = new ConcreteDecoratorA();        ConcreteDecoratorB cB = new ConcreteDecoratorB();        cA.setComponent(concreteComponent);        cB.setComponent(cA);        cB.operation();    }}

  

输出结果:

末日机甲前来报到,装备:改装:等离子高频激光剑改装:全适应立场防护盾  

  


 

  • 总结

装饰模式能动态的扩展一个类,并且不修改原来的类,能够灵活的增删,比继承要好。(感觉作用和代理模式有点象^_^)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
设计模式学习笔记
设计模式——装饰模式(Decorator)
关于装饰ServletRequest对象简介图
装饰模式与代理模式的区别(转载)
扩展系统功能——装饰模式(二)
Java设计模式之策略模式详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服