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

2024-03-25  本文已影响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();
上一篇 下一篇

猜你喜欢

热点阅读