单刀直入
今天我们来探讨以下代理模式和装饰模式的区别. 因为这两个模式太接近了, 都是需要继承一个接口, 都是功能类被另一个类执行. 我们对照了下面两张图来论述下两种模式的区别.
代理模式是客户端只关注结果, 装饰模式是客户端关注过程.
代理模式: 客户端只和代理打交道, 只是需要获取需要的的结果, 至于代理是如何获取的, 客户端根本不关心. 例如要吃肯德基, 客户网上点餐后, 肯德基5分钟后就送到了客户面前. 客户不关心肯德基是怎么过来的, 只是想要肯德基.
装饰模式: 客户端拿到功能类后, 感觉不满意, 就想对功能类进行增强. 客户端关注的是过程. 例如魔兽世界选择要玩的英雄, 我们会对英雄进行装扮, 我们非常注重英雄的造型. 关心的是过程.
代理模式是代理类反客为主, 隐藏功能类的细节. 但装饰模式只是对功能类的加强, 不能反客为主.
代理模式: 比如美团外卖和饭店的关系, 美团外卖是代理类, 饭店是功能类. 但是代理类掌握了主动权, 饭店需要讨好美团. 这也就是为什么淘宝,今日头条会屏蔽百度抓取的原因. 如果不屏蔽, 百度这个代理类就掌握了主动权, 淘宝和今日头条就发展不起来.
装饰模式: 比如追星, 大家喜欢的是明星本人, 明星成长起来后, 明星是出于主动地位, 经济公司是处于被动地位, 经济公司不管如何装饰明星, 也不可能代替明星.
代理模式使用在客户端和代理类的开发者都对结果预期比较一致的时候, 而装饰模式开发者不能猜测客户的心思, 只能提供比较多的装饰类给客户自己决定.
结尾
以上就是对代理类和装饰类的探讨, 总体来说, 代码层面虽然很接近, 比如上图的装饰模式去掉装饰子类后, 两种模式结构是非常接近的. 但是他们使用的场景完全不同. 具体的代码点击我查看