美文网首页
插件化基础知识之代理&动态代理

插件化基础知识之代理&动态代理

作者: 没有了遇见 | 来源:发表于2024-03-25 19:55 被阅读0次

    代理
    代理模式是一种设计模式,代理为其代理的对象提供一种代理以控制对这个对象的访问;在代理模式中 代理对象可以在访问被代理对象之前和之后添加额外的功能

    优点:
    在不修改代码的前提下可以对功能进行扩展
    静态代理缺点:
    需要创建代理类,多个功能需要创建多个代理类增加迭代成本

    示例:
    权限访问 根据不同的权限访问代理对象
    Vip访问 根据不同的VIP访问代理对象
    Retrofit retrofit代理了okhttp 在不改变okhttp代码的情况下添加 打印 添加头信息 格式化返回数据信息的功能

    1:静态代理

    
    /**
     * 功能接口
     */
    public interface Pay {
        void shoppingPay();
    }
    
    
    /**
     * 被代理对象
     */
    public class PayAction implements Pay{
        PayInfo info;
        public PayAction(PayInfo info) {
            this.info=info;
        }
    
        @Override
        public void shoppingPay() {
            System.out.println("PayAction:"+"开始支付");
            System.out.println("PayAction:"+info.toString());
            System.out.println("PayAction:"+"支付完成");
        }
    }
    
    
    /**
     * 代理对象
     */
    public class PayProxy implements Pay{
        Pay pay;
        public PayProxy(Pay pay) {
            this.pay = pay;
        }
        @Override
        public void shoppingPay() {
            // 只代理学生对象
            //这里可以添加 登录 库存校验
            if (pay!=null){
                System.out.println("PayProxy:"+"校验登录...");
                pay.shoppingPay();
                System.out.println("PayProxy:"+"支付完成后逻辑处理...");
            }
            //这里可以添加 支付完成后的校验
        }
    }
    
    

    2:动态代理

       PayInfo proxyPayInfo1= new PayInfo("动态代理支付",500);
            PayAction proxyPay1= new PayAction(proxyPayInfo1);
            InvocationHandler handler1= new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    try {
                        System.out.println("ProxyInvocationHandler:" + "校验登录...");
                        Object result = method.invoke(proxyPay1, args);
                        System.out.println("ProxyInvocationHandler:" + "支付完成后逻辑操作...");
                    } catch (Exception e) {
    
                    }
                    return null;
                }
            };
    
            Pay pay1= (Pay) Proxy.newProxyInstance(Pay.class.getClassLoader(),new Class[]{Pay.class},handler1);
            pay1.shoppingPay();
    

    相关文章

      网友评论

          本文标题:插件化基础知识之代理&动态代理

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