对于这两个十分接近的设计模式,确实容易产生困惑,代理模式和装饰器模式看起来十分相似,都是由两个类实现相同的接口,然后一个类套另一个类。这件事足足困扰了我5分钟之久,在此总结一下它们的差别。
目的不同
装饰器模式相当于主动可选的代理模式,是对原本功能的拓展
当你想要增强你的类,给你的类增加新功能的话,你就该使用装饰器模式了。
装饰器模式能在不影响原本类的情况下,为原本类增添额外的功能。
代理模式相当于被动的装饰器模式,是对原本功能的完善
代理模式可以代理初始化极耗时间的“重量级”类,使其在进行常规操作时由代理类代劳,当必须进行初始化时,由代理类进行初始化并加载先前的变化,可以将卡顿分散至调用时。
代理模式可以在不影响原本类的情况下,为原本类增添额外的功能(比如记录日志)。
用法不同
装饰器模式由外部调用,可以自由选择是否使用装饰器,new C(new B(new A()))
和 new C(new A())
都是可行的(A 为被装饰类)。
代理模式为内部调用,由代理模式内部调用被代理对象。单独的被代理对象很可能功能不全,甚至根本就无法被外部创建,外部调用通常也是直接调用代理类。