码迷,mamicode.com
首页 > 其他好文 > 详细

装饰模式

时间:2018-10-01 23:45:51      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:margin   返回   span   顺序   ted   .com   子类   职责   color   

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

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

  • 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关系
  • 可以动态扩展一个实现类的功能,这也是它的定义

装饰模式缺点:

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

装饰模式场景:

  • 需要动态扩展一个类的功能,或给一个类增加附加功能
  • 可以动态增加或修改一些功能,可以动态撤销

装饰模式

标签:margin   返回   span   顺序   ted   .com   子类   职责   color   

原文地址:https://www.cnblogs.com/loveBolin/p/9736057.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!