• 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

  • 相关阅读:
    总结Linq或者lamdba的写法
    JObject 用法 、JProperty 用法、JArray 用法 Linq 转 Json
    System.DateTime.Now 24小时制。
    将springboot jar应用打包成镜像并在docker运行成容器
    RPC框架——简单高效hessian的使用方式
    WebService—规范介绍和几种实现WebService的框架介绍
    Java三大体系JavaEE、JavaSE、JavaME的区别
    JavaEE体系架构
    JavaEE 技术体系
    注解之@CookieValue
  • 原文地址:https://www.cnblogs.com/pony1223/p/5589321.html
Copyright © 2020-2023  润新知