装饰模式

这是一种比较常见的模式,定义如下:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

装饰模式有四个基本角色:

  • Component抽象构件

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

  • ConcreateComponent具体构件

ConcreateComponent是最原始的、最核心的、最基本的接口或抽象类的实现,也是我们需要装饰的对象。

  • Decorator装饰角色

这一般是一个抽象类,用来干什么呢?定义装饰角色的抽象方法,在属性中必然有一个指向Component抽象构件的的private变量。

  • 具体装饰角色

用于把最原始、最核心、最基本的东西装饰为其他东西。

下面看一段通用示例代码:

//抽象构件
public abstract  class Component{
    public abstract void operate();
}
//具体构件
public class ConcreateComponent extends Component{
    @Override
    public void operate(){
    }
}
//抽象装饰者
public abstract class Decorator extends Component{
    private Component component = null;
    //通过构造函数传递被修饰者
    public Decorator(Component component){
        this.component = component;
    }
    //委托给被修饰者执行
    public void operate(){
        this.component.operate();
    }
}
//具体的装饰类
public class ConcreateDecorator1 extends Decorator{
    //定义被修饰者
    public ConcreateDecorator1(Component component){
            super(component);
    }
    //定义自己的修饰方法
    priate  void method1(){
    }
    //重写父类方法
    public void operate(){
        this.method1();
        super.operate();
    }
}
public class ConcreateDecorator2 extends Decorator{
    //定义被修饰者
    public ConcreateDecorator2(Component component){
        super(component);
    }
    //定义自己的修饰方法
    private void method2(){
    }
    //重写父类方法
    public void operate(){
        this.method2();
        super.operate();
    }
}

需要注意的是,原始方法和装饰方法的执行顺序在具体的装饰类中是固定的,但可以通过重载实现多种顺序的组合。

装饰模式优点:

  • 装饰类和被装饰类可以独立发展,而不会相互耦合
  • 装饰模式是继承关系的一个替代方案,不管装饰多少层,返回的还是原始组件的实现方法,实现的是is-a关系
  • 可以动态扩展一个实现类的功能,这也是它的定义

装饰模式缺点:

  • 多层装饰将会比较复杂,难以调试和发现问题,尽量减少装饰类的数量,降低系统复杂度。

装饰模式场景:

  • 需要动态扩展一个类的功能,或给一个类增加附加功能
  • 可以动态增加或修改一些功能,可以动态撤销
posted @ 2018-10-01 23:13  行者林  阅读(105)  评论(0编辑  收藏  举报