这两个设计模式都属于结构型模式,且非常相似,其 UML 图如下:
装饰模式:
(静态)代理模式:提到代理模式一般是指静态代理模式,动态代理模式会在动态代理实现原理中专门讲解
共同点:
- 装饰者与被装饰者,代理类与被代理类,都是继承自同一个接口,可以令他们在被调用时相互替换
不同点:
- 被装饰者往往被作为装饰者的构造器参数传入装饰者,强调被装饰者功能的增强;被代理类往往在代理类内部被创建,所以这里用 UML 里组合的关系,强调对被代理类的访问控制。
- 装饰者里持有的是被装饰者的接口类型,所以可以装饰所有实现同一接口的类;代理类是针对某一个具体的类进行代理,所以对每一个类都要实现一个对应的代理类,这是静态代理模式的局限,可以使用动态代理模式来弥补。