zoukankan      html  css  js  c++  java
  • Java代理模式

    代理模式,顾名思义,就是想要访问真实对象时,需要先和中间人接触,让中间人去接触真实对象,最后把我想要的一起拿回来。

    interface Interface{
        void doSomething();
        void somethingElse(String arg);
    }
    class RealObject implements Interface{
        public void doSomething() {System.out.println("我是doSomething");}
        public void somethingElse(String arg) {System.out.println("somethingEles"+arg);}
    }
    class SimpleProxy implements Interface{
        private Interface proxied;
        public SimpleProxy(Interface proxied){this.proxied = proxied;}
        public void doSomething() {
            System.out.println("我是代理哦");
            proxied.doSomething();
        }
        public void somethingElse(String arg) {
            System.out.println("我是代理哦哦"+arg);
            proxied.somethingElse(arg);
        }
        public static void consumer(Interface iface){
            iface.doSomething();
            iface.somethingElse("boona");
        }
        public static void main(String[] args) {
            consumer(new RealObject());
            consumer(new SimpleProxy(new RealObject()));
        }
        /*  控制台打印信息:
            我是doSomething
            somethingElesboona
            我是代理哦
            我是doSomething
            我是代理哦哦boona
            somethingElesboona */
    }
    

    以上代码实现了静态代理,下面我们来分析一下代码。

    一个接口,一个实现接口的真实对象类,一个实现接口的代理对象类。

    静态代理的缺点:

    假如现在接口变成了另一个接口,那么真实对象类需要重写,代理对象类也需要重写。也就是说,代理对象对真实对象所作的所有代理操作全部需要重写。代码将无法复用。

    动态代理:

    而JDK实现的动态代理,就是把代理对象对真实对象所作的操作代码抽象出来,也就是说即使接口A变成了接口B,这个代理的所有操作还是可以用的,这是因为动态代理处理器将代理对象proxied设置成Object,所以可以通用。

    interface Interface{
        void doSomething();
        void somethingElse(String arg);
    }
    class RealObject implements Interface{
        public void doSomething() {System.out.println("我是doSomething");}
        public void somethingElse(String arg) {System.out.println("somethingEles"+arg);}
    }
    class DynamicProxyHandler implements InvocationHandler {
        Object proxied = null;
        public DynamicProxyHandler(Object t){this.proxied = t;}
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("目前的方法:"+method+"参数:"+args);
            //利用反射调用当前的方法
            return method.invoke(proxied, args);
    	}
    }
    class SimpleDynamicProxy{
        public static void consumer(Interface iface){
            iface.doSomething();
            iface.somethingElse("boona");
        }
        public static void main(String[] args) {
            RealObject object = new RealObject();
            consumer(object);
            //生成代理类
            Interface proxy = (Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(),
                        new Class[] { Interface.class }, new DynamicProxyHandler(object));
            consumer(proxy);
        }
        /*  控制台打印信息:
            我是doSomething
            somethingElesboona
            目前的方法:public abstract void study.Interface.doSomething()参数:null
            我是doSomething
            目前的方法:public abstract void study.Interface.somethingElse(java.lang.String)参数:[Ljava.lang.Object;@6bc7c054
            somethingElesboona
        */
    }
    

    这时候代码只有
    一个接口,一个实现接口的真实对象类。
    代理对象类被抽象成了公共接口。

  • 相关阅读:
    Linux内核之系统调用
    [转]Linux最多支持的SCSI Disk的数目
    bash一些技巧
    [转]Iptables 规则 一些简单实例和详细介绍
    近来工作和面试一些人的感受(原)
    自动给URL地址加上超链接
    在ASP.NET虚拟主机上实现URL重写(UrlRewrite)
    使用Office组件读取Excel,引用Microsoft.Office.Interop.Excel出现的问题
    Fixing Twitter 提高世界上最流行的微博客系统性能和可扩展性(转)
    从优酷网学习SEO的标题(title)和关键字(keywords)如何选择
  • 原文地址:https://www.cnblogs.com/bihanghang/p/9994558.html
Copyright © 2011-2022 走看看