设计模式之装饰者模式

装饰者模式

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

设计思路分析

  • 装饰模式属于对象结构型模式
  • 被装饰对象不知道装饰者对象的存在
  • 被装饰者对象没有改变
  • 装饰者模式通过装饰者的装饰者与装饰者组成装饰者链顺序实现多样化装饰组合

装饰者模式类

模式类结构图

在这里插入图片描述

模式的结构说明

  • Component:是定义一个接口规范需要被装饰的函数,可以通过装饰者对象动态的拓展接口职责;
  • Decorator:装饰着抽象类,继承了Component,从外类来拓展Component类的功能,但对于Component来说,是无需知道Decorator的存在的;
  • ConcreteComponent:是定义一个具体的对象,可以通过这个装饰者对象给这个对象添加一些职责。
  • ConcreteDecorator:就是具体的装饰对象,起到给Component添加职责的功能

Demo

Component.java

/**
 * difinite a instance of Component
 *
 * @AUTHOR:Frank.Liu
 * @DATE:08/03/2018
 */
public interface Component{
    void operation();
}

Decorator.java

/**
 * Abstarct decorator class
 *
 * @AUTHOR:Frank.Liu
 * @DATE:08/03/2018
 */
public abstract class Decorator implements   Component{


    protected  Component  component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if(component != null){
            component.operation();
        }
    }

}

ConcreteComponent.java

/**
 * @AUTHOR:Frank.Liu
 * @DATE:08/03/2018
 */
public class ConcreteComponentA implements Component {

    @Override
    public void operation() {
        System.out.println("ConcreteComponentA operation method ");
    }
}

ConcreteDecoratorA.java

/**
 * Decorator Component : definite interface to add function
 *
 * @AUTHOR:Frank.Liu
 * @DATE:08/03/2018
 */
public  class ConcreteDecoratorA extends  Decorator{

    @Override
    public void operation() {
        super.operation();
        // add new behavior
        addBehavior();
    }

    private void addBehavior() {
        System.out.println("ConcreteDecoratorA add behavior");
    }
}

ConcreteDecoratorB.java

/**
 * @ClassName ConcreteDecoratorB
 * @Description TODO
 * @AUTHOR:Frank.Liu
 * @DATE:08/22/2019
 * @Version V1.0
 */
public class ConcreteDecoratorB extends  Decorator {


    @Override
    public void operation() {
        super.operation();
        // add new behavior
        addBehavior();
    }


    private void addBehavior() {
        System.out.println("ConcreteDecoratorB add behavior");
    }
}

装饰者模式特点

  • 当只有一个被装饰者类ConreteComponent而没有抽象的被装饰者类Component,那么Decorator类可以是ConcreteComponent的一个子类。反之如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。

装饰者模式优缺点

优点

  • 把类中的装饰功能从类中搬移去除,这样可以简化原有的类
  • 有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。
  • 采用装饰模式拓展对象的功能比采用继承方式更加灵活
  • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合

缺点

  • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂;

装饰者模式使用场景

  • 当需要给一个现有类增加附加职责,而又不能采用生成子类的方法进行扩充时;
  • 当需要通过对现有的一组基本功能进行排列组合而产生更多的功能时,采用继承关系很难负责,而采用装饰模式却很好实现。
  • 当对象的功能要求可以动态的添加,也可以动态的撤销时。

总结

  • 装饰模式是为已有功能动态地添加更多功能的一种方式。
  • 装饰者与装饰者组成装饰着链

版权声明:本文为xintonghanchuang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。