JAVA设计模式:代理模式&& 装饰模式区别
在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解:
装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖。
public interface Sourcable { public void go(); } public class Source implements Sourcable { public void go() { System.out.println("Source method go()"); } } public class Decorator implements Sourcable { private Sourcable sourcable; public Decorator(Sourcable sourcable){ this.sourcable = sourcable; } public void go() { //这里可以有你的处理 sourcable.go(); //这里可以有你的处理 } }
代理模式就像生活中的一些代理商一样,他们原本不做任何事,但是我们可以通过他买到一些我们需要的东西。
public class ObjectDynamicProxy implements InvocationHandler{ //真实对象引入 private Object proxyObj; public void setObj(Object obj) { this.proxyObj = obj; } public ObjectDynamicProxy(Object obj){ this.proxyObj = obj; } public Object invoke(Object object, Method method, Object[] args) throws Throwable { System.out.println("before dynamic proxy method."); Object obj = method.invoke(proxyObj, args); System.out.println("after dynamic proxy method."); return obj; } /** * 代理对象生产工厂 * @param obj * @return */ public static Object factory(Object obj) { //获取传入对象的Class对象 Class<?> classType = obj.getClass(); //生成代理对象并返回 //该对象实现传入对象所实现的接口 //生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用 return Proxy.newProxyInstance(classType.getClassLoader(), classType .getInterfaces(), new ObjectDynamicProxy(obj)); } } public class Client { @SuppressWarnings("unchecked") public static void main(String[] args) { //通过代理对象生成工厂生成该代理对象 List list = (List)ObjectDynamicProxy.factory(new ArrayList()); list.add("hello"); } }
区别:
代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。
具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等
用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,常常在一个代理类中创建一个对象的实例。
但是当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
需要理解更细的区别,我觉得这篇博客写的不错:
http://www.cnblogs.com/onlywujun/archive/2013/03/28/2985887.html
可以看看。
http://blog.csdn.net/lulei9876/article/details/39994825
另外学习设计模式的基础知识为:
http://uule.iteye.com/blog/2078935
http://blog.csdn.net/tianhai110/article/details/6339565