代理
代理模式是一种设计模式,代理为其代理的对象提供一种代理以控制对这个对象的访问;在代理模式中 代理对象可以在访问被代理对象之前和之后添加额外的功能
优点:
在不修改代码的前提下可以对功能进行扩展
静态代理缺点:
需要创建代理类,多个功能需要创建多个代理类增加迭代成本
示例:
权限访问 根据不同的权限访问代理对象
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();