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

 

posted on 2016-06-15 22:42  pony1223  阅读(634)  评论(0编辑  收藏  举报

导航