• Java设计模式之(七)——装饰器模式


    1、什么是装饰器模式?

    Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible
    alternative to subclassing for extending functionality.

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

    说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。

    2、装饰器模式定义

    image-20210909082623357

    ①、Component抽象构件

    Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

    ②、ConcreteComponent 具体构件

    ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。

    ③、Decorator装饰角色

    一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。

    ④、ConcreteDecorator 具体装饰角色

    ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西

    3、装饰器模式通用代码实现

    /**
     * 抽象构件
     */
    public abstract class Component {
        public abstract void operator();
    }
    
    /**
     * 具体构件
     */
    public class ConcreteComponent extends Component{
        @Override
        public void operator() {
            System.out.println("doSomething");
        }
    }
    
    /**
     * 抽象装饰者
     */
    public abstract class Decorator extends Component{
        private Component component;
    
        public Decorator(Component component){
            this.component = component;
        }
    
        // 委托给被修饰者执行
        @Override
        public void operator() {
            this.component.operator();
        }
    }
    
    public class ConcreteDecorator1 extends Decorator{
        // 定义被修饰者
        public ConcreteDecorator1(Component component){
            super(component);
        }
    
        // 定义自己的修饰方法
        public void method1(){
            System.out.println("修饰方法 method1");
        }
        @Override
        public void operator() {
            this.method1();
            super.operator();
        }
    }
    
    public class ConcreteDecorator2 extends Decorator{
        // 定义被修饰者
        public ConcreteDecorator2(Component component){
            super(component);
        }
    
        // 定义自己的修饰方法
        public void method2(){
            System.out.println("修饰方法 method2");
        }
        @Override
        public void operator() {
            super.operator();
            this.method2();
        }
    }
    

    客户端测试:

    public class DecoratorClient {
        public static void main(String[] args) {
            Component component = new ConcreteComponent();
            // 第一次修饰
            component = new ConcreteDecorator1(component);
            // 第二次修饰
            component = new ConcreteDecorator2(component);
            // 修饰后运行
            component.operator();
        }
    }
    

    打印结果:

    image-20210909230652141

    4、装饰器模式优点

    ①、装饰模式可以动态地扩展一个实现类的功能。

    ②、装饰类和被装饰类可以独立发展, 而不会相互耦合。 换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。

    ③、装饰模式是继承关系的一个替代方案。 我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系

    5、装饰器模式应用场景

    ①、需要扩展一个类的功能, 或给一个类增加附加功能。

    ②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。

    作者:IT可乐

    资源:微信搜【IT可乐】关注我,回复 【电子书】有我特别筛选的免费电子书。
    本文版权归作者所有,欢迎转载,但未经作者同意不能转载,否则保留追究法律责任的权利。
  • 相关阅读:
    BZOJ 2752: [HAOI2012]高速公路(road)
    codevs 1979 第K个数
    洛谷 P2680 运输计划
    hdu 3501 Calculation 2
    POJ 2417 Discrete Logging
    比较数组和字典
    js事件之event.preventDefault()与event.stopPropagation()用法区别
    alert
    js基本类型的包装对象
    js取自定义data属性
  • 原文地址:https://www.cnblogs.com/ysocean/p/15595252.html
Copyright © 2020-2023  润新知