之前了解过“代理模式”,最经典的例子就是“房屋中介”,房东是被代理对象(也称为真实对象),中介公司是代理对象,共同实现同一个接口,而租房子的家伙就是客户端调用者。租房狗调用一个租房接口,实现自己的租房业务,而中介公司作为租房接口的实现类,成为租房狗实际调用的对象(这就是面向接口编程的一种实践),租房狗是接触不到真正的房东的,但房子毕竟还是房东的啊,这意味着这核心的业务还是属于被代理对象的,代理对象只是在别人调用真实对象时,增加一些自己的方法,比如收点手续费什么的。这里就不上代码了,网上有很多相关的例子讲的很清楚。

作为java程序员,最经典的关于的代理例子,当然是Spring的AOP啦!Spring AOP为真实对象注入切面,包括日志、权限检验,方法拦截等。

之前对“装饰器模式”的理解很模糊,知道java的IO框架大量地用到这个模式,今天上午看了几篇讲“装饰器模式”的文章,发现:咦?装饰器被装饰对象怎么也是实现同一个接口?怎么也是在增强被装饰对象的真实方法?突然有点糊涂了。

随即在网上搜了几篇讲两者区别的文章,归纳起来大致是这样的:

  1. 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而对于装饰器模式,被装饰对象的引用通常是作为装饰器的构造函数的参数传入的,这种关系在运行期才能确定。
    这个说法还真的有待商榷,那怎么解释Spring AOP运行期的动态代理机制呢,就算抛开这个不谈,我觉得这并不是两者的核心区别
  2. 代理模式是控制控制访问,而装饰器模式是新增行为
    相比较而言,这个说法还是比较靠谱的,可问题又来了,如何区分“控制访问”和“新增行为呢”,这个问题确实不好回答,AOP里的方法拦截算不算一种“新增行为”呢?某些时候单从字面去理解的话,确实不太好判定

其实我对这两个模式的理解也不是很深刻,例如“装饰器模式”里提高,它是使用“组合”来代替“继承”以拓展父类的方法,对于“组合”和“继承”的区别优劣还不是特别理解。
总而言之,要想理解某个设计模式单靠看概念肯定是不够的,还必须结合自己的编程实际以及源码阅读还提升自己的理解能力。
这篇文章也只是记录我对这两个模式的一点思考,自然是不够系统全面的,先在这里立一个flag,等以后知识水平提高了再来谈笑风生,全面地介绍关于设计模式的人生经验。

参考链接:
http://blog.csdn.net/ljl157011/article/details/17882253
http://www.iteye.com/topic/830861


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

JavaWeb 编码问题 上一篇
java 枚举类初探: 反编译&语法糖 下一篇