Skip to content

Latest commit

 

History

History
57 lines (48 loc) · 1.98 KB

代理模式和装饰器模式的区别.md

File metadata and controls

57 lines (48 loc) · 1.98 KB

代理模式和装饰器模式的区别

示例:

// 孩子会吃饭
public interface IChild {
    void eat();
}

// 孩子类,实现吃饭接口
public class Child implements IChild{
    @Override
    public void eat() {
        Log.e("TAG","孩子吃饭");
    }
}

// 父母(代理)类(代理帮助孩子正确处理吃饭流程)
public class Parent implements IChild{
    private Child child;
    private Parent(Child child){
        this.child = child;
    }

    @Override
    public void eat() {
        Log.e("TAG","父母做饭");
        child.eat();
        Log.e("TAG","父母收拾餐具");
    }
}

// 孩子扩展(装饰)类(孩子能自理)
public class ChildWrapper implements IChild{
    private Child child;
    public ChildWrapper(Child child){
        this.child = child;
    }

    @Override
    public void eat() {
        Log.e("TAG","孩子做饭");
        child.eat();
        Log.e("TAG","孩子收拾餐具");
    }
}
// 以上是代理和装饰的简化写法,差别几无。但是代理模式偏重于对对象的控制,装饰模式侧重于对原对象功能的扩展,扩展后的对象仍是是对象本身。

总结:

  1. 代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。
  2. 装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。
  3. 对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能;
  4. 对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。
  5. 被装饰者一旦身份增加,作为装饰类,也需要相应的扩展,这必然造成编码的负担。