欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式-装饰模式学习笔记

程序员文章站 2022-07-10 11:50:50
装饰模式 装饰模式:在不对原有类进行修改的情况下动态的对它进行扩展一些功能 优缺点 优点: 缺点: 特点 结构 Component:装饰对象和被装饰对象的共同父类 ConcreteComponent:被装饰类,也为具体实现类 Decorator:装饰类,自装饰类的父类 ConcreteDecorat ......

装饰模式

装饰模式:在不对原有类进行修改的情况下动态的对它进行扩展一些功能

 


 

  • 优缺点

优点:

  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("改装:全适应立场防护盾");
    }
}

输出结果:

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

  


 

  • 总结

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