Android 装饰者模式

来源:互联网 发布:js防水施工工艺 编辑:程序博客网 时间:2024/06/06 01:45

装饰者模式

1、定义

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更加灵活,提供了有别于继承的另一种选择。

2、使用场景

需要动态且透明地扩展类的功能时。

3、装饰者的UML图

![这里写图片描述](http://img.blog.csdn.net/20160609163506648)

4、装饰者通用代码

抽象组件类

/**  *抽象的方法,这个随你做  *同样地你也可以增加更多的抽象方法  /public abstract class Component{    public abstract void operate();}

组件具体实现类

public class ConcreteComponent extends Component {    @Override    public void operate() {        //具体逻辑    }}

抽象装饰者

public class Decorator extends Component {    private Component component;//持有一个Component对象的引用    /**     * 必须要有构造方法,需需要一个Component类型的对象     */    public Decorator(Component component) {        this.component = component;    }    @Override    public void operate() {        component.operate();    }}

装饰者的具体实现类

 /**   *  ConcreteDecoratorB与ConcreteDecoratorA代码类似,不再给出   */public class ConcreteDecoratorA extends Decorator {    public ConcreteDecoratorA(Component component) {        super(component);    }    @Override    public void operate() {        operateA();        super.operate();        operateB();    }    /**     * 自定义的装饰方法A     */    private void operateA() {        //装饰方法的逻辑    }    /**     * 自定义的装饰方法B     */    private void operateB() {        //装饰方法的逻辑    }}

客户调用类

public class Client {    public static void main(String [] args){        //构造被装饰组件对象        Component component = new ConcreteComponent();        //根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的功能方法        Decorator decoratorA = new ConcreteDecoratorA(component);        decoratorA.operate();        //根据组件对象构造装饰者对象B并调用,此时相当于给组件对象增加装饰者B的功能方法        Decorator decoratorB = new ConcreteDecoratorB(component);        decoratorB.operate();    }}

5、装饰者模式的4大角色

1、Component:抽象组件。可以是一个接口或者是抽象类,其充当的就是被装饰的原始对象,用来定义装饰者和被装饰者的基本行为。2、ConcreteComponent:组件具体实现类。该类是 Component 类的基本实现,也是我们装饰的具体对象。3、Decorator:抽象装饰者装饰组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类。当然,如果是装饰逻辑单一,只有一个的情况下我们可以忽略该类直接作为具体的装饰者。4、ConcreteDecoratorA 和 ConcreteDecoratorB:装饰者具体实现类。对抽象装饰者的具体实现。

6、装饰者模式实现的5大步骤

1、继承或者实现 Component 组件,生成一个 Decorator 装饰者抽象类;

2、在生成的这个 Decorator 装饰者类中,增加一个 Component 的私有成员对象;

3、将 ConcreteComponent 或者其他需要被装饰的对象传入 Decorator 类中并赋值给上一步的 Component 对象;

4、在装饰者 Decorator 类中,将所有的操作都替换成该 Component 对象的对应操作;

5、在 ConcreteDecorator 类中,根据需要对应覆盖需要重写的方法。