结构型--装饰者模式

来源:互联网 发布:flash cc mac 编辑:程序博客网 时间:2024/06/05 16:59

模式意图

动态的给对象添加一些额外的职责。就功能来说装饰模式比生成子类更为灵活。

模式适用性

在许多程序设计中,可能需要改进类的某个对象的功能,而不是该类创建的全部对象。

模式参与者

  1. 抽象组件(Component):抽象组件是一个抽象类。抽象组件定义了“被装饰着”需要进行“装饰”的方法。
  2. 具体组件(ConcreteComponent):具体组件是抽象组建的一个子类,具体组件的实例称作“被装饰者”。
  3. 装饰(Decorator):装饰也是抽象组件的一个子类,但装饰还包含抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是一个抽象类或者非抽象类,如果是抽象类,那么该类的实例称为装饰者。
  4. 具体装饰(ConcreteDecotator):具体装饰是装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。

装饰者模式要实现的一个重大功能就是运行时动态的给对象添加行为。其中具体组件和装饰都是抽象组件的子类,而具体装饰是装饰的子类,我们可以通过具体装饰类来装饰我们的抽象组件子类具体组件。

看一个例子:
抽象组件:Bird.java

public abstract class Bird {    public abstract int fly();}

具体组件:Sparrow.java

public class Sparrow extends Bird{      public final int DISTANCE = 100;    @Override    public int fly() {        return DISTANCE;    }}

装饰(Decorator): Decorator.java

public abstract class Decorator extends Bird{    protected Bird bird;    public Decorator() {            }    public Decorator(Bird bird){        this.bird = bird;    }}

具体装饰(ConcreteDecorator):SparrowDecorator.java

public class SparrowDectorator extends Decorator{            public final int DISTANCE = 50;     public SparrowDectorator(Bird bird) {                    super(bird);            }            @Override    public int fly() {        int distance = 0;        distance = bird.fly() + eleFly();        return distance;    }    private int eleFly(){        return DISTANCE;    }       }

优点

  1. 被装饰者和装饰者之间是松耦合关系。
  2. 装饰模式满足“开-闭原则”。不必具体修改组件,就可以增加新的针对该具体组件的具体装饰。
  3. 可以使用多个具体装饰来装饰具体的实例。
0 0
原创粉丝点击