代理模式和装饰器模式的区别要从类的调用者的角度来看。
代理模式:业务无关,用户无感知
装饰器模式:业务相关,用户可选择
对于代理模式,调用者不需要知道代理类中有哪些额外的功能模块,直接调用代理类即可。正如我们找别人“代理”办事一样,我不需要知道代理人为我们多做了哪些事,我们只关心我们交代的事情有没有办好。
而对于装饰器模式,调用者则需要知道装饰类提供的额外的功能,来满足定制化的服务。就好比买手机时的套餐服务,我们不仅关心手机的好坏,我们还关心提不提供保修、送不送充电器等额外的服务。
对于增加“缓存”功能这一具体场景来说:对于类的设计者来说,如果设计者认为“缓存”功能对于调用者来说在任何时刻都是必要的,那么则选择代理模式;如果设计者认为“缓存”功能对调用者来说是可有可无的,希望调用者根据自己的需要来定制的,那么则选择装饰器模式
本质都是:“组合优于继承”,将调用方的请求给委托类