美文网首页Java设计模式
设计模式-代理模式-Proxy

设计模式-代理模式-Proxy

作者: AdminFun | 来源:发表于2019-01-16 10:40 被阅读6次

    代理(Proxy)顾名思义:为避免2者之间直接接触,委托方寻求第三方(代理方)帮忙处理一些委托方的需求。最经典的例子就是打官司:委托方就是被代理方,律师就是代理方,律师的职责就是避免原被告直接接触。

    一、使用场景

    如果2者之间需要通信,且2者之间必须解耦,需引入一个三方类来预处理通信、和通信结果处理。这个三方类就是代理类。
    代理类能完全控制对委托对象的直接访问,也可以保护委托对象不被直接访问,同时也预留了通信处理空间,在设计上有更大的灵活性。

    二、静态代理方式

    1、被代理者
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     * 描述: 被代理者
     */
    public class CS35Info implements ICar {
    
        @Override
        public double getPrice() {
            return 90000;
        }
    
        @Override
        public String getModel() {
            return "长安CS35";
        }
    }
    
    2、静态代理
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     * 描述: 静态代理
     * <p>
     * 静态代理的写法和装饰器有点类似,区别在于:
     * 1、代理的构造传入的是实例,而装饰器构造传入的是抽象
     * 2、代理想要控制实例的访问权限,而装饰意在控制对象的行为
     */
    public class ProxyStatic implements ICar {
    
        private CS35Info cs35Info;
    
        public ProxyStatic(CS35Info cs35Info) {
            this.cs35Info = cs35Info;
        }
    
        @Override
        public double getPrice() {
            return cs35Info.getPrice();
        }
    
        @Override
        public String getModel() {
            return cs35Info.getModel();
        }
    }
    
    3、调用
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     */
    public class ProxyTest {
    
        public static void main() {
            // 静态代理
            ProxyStatic proxyStatic = new ProxyStatic(new CS35Info());
            Log.d("common", "静态代理:" + proxyStatic.getModel());
        }
    }
    

    三、动态代理

    被代理方还是上面的被代理类,这里不再重写。

    1、动态代理
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     * 描述:动态代理
     * 动态代理和静态代理的区别
     * 1、静态代理需要代理方和委托方都实现相同的接口,接口方法变动后,双方都要随着变动,代码维护成本增加。
     * 2、动态代理是利用反射机制,可代理任何对象,且不需要维护成本。
     */
    public class ProxyDynamic implements InvocationHandler {
    
        private Object target;//被代理的对象
    
        public ProxyDynamic(Object obj) {
            this.target = obj;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(target, args);
        }
    }
    
    2、调用
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     */
    public class ProxyTest {
    
        public static void main() {
            // 动态代理
            final ICar car = new CS35Info();
            // 方式1
            ICar proxy = (ICar) Proxy.newProxyInstance(
                    car.getClass().getClassLoader(),
                    car.getClass().getInterfaces(),
                    new ProxyDynamic(car)
            );
            // 方式2
            ICar proxy1 = (ICar) Proxy.newProxyInstance(
                    car.getClass().getClassLoader(),
                    car.getClass().getInterfaces(),
                    new InvocationHandler() {
    
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            return method.invoke(car, args);
                        }
                    });
    
            Log.d("common", "动态代理:" + proxy1.getModel());
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式-代理模式-Proxy

        本文链接:https://www.haomeiwen.com/subject/jafddqtx.html