设计模式-装饰模式


装饰模式的定义

*装饰(Decorator)模式: * 指在不改变现有对象结构的情况下,动态的给该对象增加一些职责(即增加额外功能)的模式,它属于对象结构型模式

特点

  1. *优点: *
    • 采用装饰模式扩展对象的功能比采用继承方式更加灵活
    • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合(Java IO即采用装饰模式)
  2. *缺点: *
    • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂

模式的结构与实现

通过组合关系来包装对象,达到扩展对象功能的目的,同时实现统一接口,可以传入同类型对象达到互相装饰效果

  1. 模式的结构

    • 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象

    • 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责

    • 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能

    • 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任

      装饰模式结构图

  2. 模式的实现

    /**
     * 装饰模式
     * 通俗说就是使用组合将对象传入,然后进行扩展,
     * 同时实现统一的接口,传入对象类型为接口类型,可以使具体构件达到互相装饰的效果
     */
    //抽象构件角色: 统一接口
    interface Component{
        void operation();
    }
    //具体构件角色
    class ConcreteComponent implements Component{
        public ConcreteComponent() {
            System.out.println("创建具体构件角色");
        }
        @Override
        public void operation() {
            System.out.println("调用具体构件角色的方法operation()");
        }
    }
    //抽象装饰角色
    class Decorator implements Component{
        private Component component;  //使用组合传入具体构件
        public Decorator(Component component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            component.operation(); //调用具体构件的方法
        }
    }
    //具体装饰角色
    class ConcreteDecorator extends Decorator{
        public ConcreteDecorator(Component component) {
            super(component);
        }
    
        @Override
        public void operation() {
            super.operation();
            addedFunction();    //增加额外功能
        }
        public void addedFunction(){
            System.out.println("为具体构件角色增加额外的功能addedFunction()");
        }
    }
    //测试
    public class DecoratorPattern {
        public static void main(String[] args) {
            Component p = new ConcreteComponent();
            p.operation();
            System.out.println("-----------------");
            Component d = new ConcreteDecorator(p);
            d.operation();
        }
    }

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
设计模式-外观模式 设计模式-外观模式
外观模式的定义 *外观(Facade)模式: * 是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式,该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提交了
2020-04-15
下一篇 
设计模式-桥接模式 设计模式-桥接模式
桥接模式的定义 *桥接(Bridge)模式: * 将抽象与实现分离,使他们可以独立变化,它是用组合关系代替继承关系来实现的,从而降低了抽象与实现这两个可变维度的耦合度 特点 *优点: * 由于抽象与实现分离,所以扩展能力强 其实现细节对客
2020-04-08
  目录