本文共 3291 字,大约阅读时间需要 10 分钟。
代理模式是一种常见的软件设计模式,主要用于在某些情况下直接访问目标对象不现实或不合适时,为目标对象提供一个代理对象。这个代理对象可以控制对目标对象的访问,或者在必要时进行一些额外的操作。
代理模式主要包含三个角色:
静态代理是指在编译阶段就生成代理类,常见于像小程序前端逻辑这样不需要频繁修改的地方。
示例:火车票代售点
// 抽象主题接口public interface SellTickets { void sell();}// 真实主题类:火车站public class TrainStation implements SellTickets { public void sell() { System.out.println("火车站卖票"); }}// 代理类:代售点public class ProxyPoint implements SellTickets { private TrainStation station = new TrainStation(); public void sell() { System.out.println("代售点收取服务费用"); station.sell(); }}// 测试类public class Client { public static void main(String[] args) { ProxyPoint pp = new ProxyPoint(); pp.sell(); }} 输出结果:
代售点收取服务费用火车站卖票
JDK动态代理由Java提供,适用于接口型的代理。其工作原理是通过反射机制动态生成代理类。
代码示例
// 抽象主题接口public interface SellTickets { void sell();}// 真实主题类:火车站public class TrainStation implements SellTickets { public void sell() { System.out.println("火车站卖票"); }}// 代理工厂类public class ProxyFactory { private TrainStation station = new TrainStation(); public SellTickets getProxyObject() { return (SellTickets) Proxy.newProxyInstance( station.getClass().getClassLoader(), station.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("JDK动态代理收取服务费用"); return method.invoke(station, args); } } ); }}// 测试类public class Client { public static void main(String[] args) { ProxyFactory factory = new ProxyFactory(); SellTickets proxyObject = factory.getProxyObject(); proxyObject.sell(); }} 输出结果:
JDK动态代理收取服务费用火车站卖票
CGLIB动态代理适用于没有接口的情况,通过生成目标类的子类来实现代理。
代码示例
// 真实主题类:火车站public class TrainStation { public void sell() { System.out.println("火车站卖票"); }}// 代理工厂类(实现MethodInterceptor接口)public class ProxyFactory implements MethodInterceptor { private TrainStation target = new TrainStation(); public TrainStation getProxyObject() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return (TrainStation) enhancer.create(); } public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("CGLIB动态代理收取服务费用"); return methodProxy.invokeSuper(o, args); }}// 测试类public class Client { public static void main(String[] args) { ProxyFactory factory = new ProxyFactory(); TrainStation proxyObject = factory.getProxyObject(); proxyObject.sell(); }} 输出结果:
CGLIB动态代理收取服务费用火车站卖票
JDK vs CGLIB:
静态代理 vs 动态代理:
优点:
缺点:
通过以上分析,可以看出代理模式在系统设计中具有广泛的应用场景,能够有效地降低系统耦合度并提高灵活性。
转载地址:http://jzhfk.baihongyu.com/