11.4设计模式-装饰模式-讲解

设计模式-装饰模式

    1. 装饰模式详解
    1. 装饰模式在android中的实际运用,避免了耦合
11_1-11-7[01_18_09][20180801-213800-0].jpg

1. 装饰模式详解

1.概念
    装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类对象更为灵活。装饰模式一种对象结构模式。
    
    通常会定义一个抽象的装饰类,然后将具体的装饰类作为他的子类,然后继承具体的装饰类。
2.使用场景
    1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责(添加相应的方法,这一点上与继承的方式是一样的,给特定对象单独的添加方法,而不会影响其他)
    2.当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时使用装饰模式
        继承有两个特殊情况不能使用:1.系统中存在大量独立的扩展,为支持每一个扩展和扩展之间的组合,如果使用继承的方式,会使得子类数量非常的多
        2.有些final类不能继承,只能用装饰模式来扩展
3.UML结构图分析
    图:
                                接口Component 
                                ----------------
                                +operation();
    
    具体实现类ConcreteComponent                           类Decorator(扩展左侧对象功能)       
    ------------------------------                 ---------------持有ConcreteComponent引用
    +operation();                                  +operation();->concreteComponent.operation();
    
    
                                        ConreteDecoratorA         ConreteDecoratorB
                                        -addedState
                                        +operation();         +operation();//super.operation();
                                                              +addedBehavior();
        
4.实际代码分析
public interface Component{
    public void operation();
}
public class Decorator implements Component{
    private Component compenent;//持有一个对抽象构建对象的引用
    public Decorator(Component component){
        this.component = compnent;
    }
    public void operation(){//这里并没有真正的装饰,只是提供了统一的接口而已,具体的装饰过程交给子类
        component.operation();//调用原有业务方法
    }
}

public class ConcreteDecorator extends Decorator{
    public ConcreteDecorator(Component compnent){
        super(component);
    }
    public void operation(){
        super.operation2.();//调用原有业务方法
        addedBehavior();//调用新增业务方法
    }
    //新增业务方法
    public void addedBehavior(){
    }
}


5.装饰模式的优点
    1.对于扩展一个对象的功能,装饰模式比继承更加的灵活,不会导致类的个数急剧增加。

2.装饰模式在android中的实际运用,避免了耦合

        java当中的io流设计
    2.可以通过一种动态的方式来扩展一个对象的功能
        比如 在javaWeb中可以通过配置文件运行的时候选择不同的装饰类,从而实现不同的行为
    3.可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合
缺点:虽然提供了比继承更加灵活的方案,但是比继承更容易出错


Context,ContextWraper
ContextImpl:启动Activity,发送广播,bindService等等,对开发者来说是一个高层的接口

疑问:装饰器模式和外观模式的区别

你可能感兴趣的:(11.4设计模式-装饰模式-讲解)