已解决
基于Java的设计模式 - 代理模式
来自网友在路上 157857提问 提问时间:2023-09-19 06:29:18阅读次数: 57
最佳答案 问答题库578位专家为你答疑解惑
代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。简单来讲就是在不修改目标对象的基础上,增强主业务逻辑的设计模式。
代理模式基本可分为三种
- 静态代理
- JDK动态代理
- CGLIB动态代理
上述简单分就是静态和动态代理,静态代理即程序运行之前已创建了代理类,动态代理是程序运行时通过反射机制动态创建代理对象。
静态代理
DoService.java
//主业务接口
public interface DoService {void doSomething();
}
DoServiceImpl.java
public class DoServiceImpl implements DoService {@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("业务操作");}}
ServiceProxy.java
//代理类
public class ServiceProxy implements DoService {private DoService target;public ServiceProxy(){super();//创建目标对象target = new DoServiceImpl();}@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("代理类--业务处理前操作");target.doSomething();System.out.println("代理类--业务处理后操作");}}
TestStaticProxy.java
public class TestStaticProxy {public static void main(String[] args) {DoService service = new ServiceProxy();service.doSomething();}
}
JDK动态代理
DoService.java
//主业务接口
public interface DoService {void doSomething();
}
DoServiceImpl.java
public class DoServiceImpl implements DoService {@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println("业务操作");}}
TestJdkProxy.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class TestJdkProxy {public static void main(String[] args) {// TODO Auto-generated method stubDoService target = new DoServiceImpl();// 使用JDK的Proxy动态代理,要求目标类必须实现接口// 因为其底层的执行原理,与静态代理相同DoService service = (DoService) Proxy.newProxyInstance(target.getClass().getClassLoader(), // 目标类的类加载器target.getClass().getInterfaces(), // 目标类所实现的所有接口new InvocationHandler() { // 匿名内部类// proxy:代理对象// method:目标方法// args 目标方法的参数列表@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// TODO Auto-generated method stubSystem.out.println("代理类--业务处理前操作");// 调用目标方法Object result = method.invoke(target, args);System.out.println("代理类--业务处理后操作");return result;}});service.doSomething();}
}
使用jdk的proxy实现代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现
CGLIB动态代理
DoService.java
//主业务
public class DoService {public void doSomething() {System.out.println("业务操作");}
}
MyCglibFactory.java
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class MyCglibFactory implements MethodInterceptor {private DoService target;public MyCglibFactory() {super();// TODO Auto-generated constructor stubtarget = new DoService();}public DoService MyCglibCreator(){//创建增强器对象Enhancer enhancer = new Enhancer(); //指定目标类,即父类enhancer.setSuperclass(DoService.class);//设置回调接口对象enhancer.setCallback(this);return (DoService) enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {// TODO Auto-generated method stubSystem.out.println("代理类--业务处理前操作");Object result = method.invoke(target, args);System.out.println("代理类--业务处理后操作");return result;}}
TestCglibProxy.java
public class TestCglibProxy {public static void main(String[] args) {DoService service = new MyCglibFactory().MyCglibCreator();service.doSomething();}
}
对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现,CGLIB代理的生成原理是生成目标类的子类,而子类是增强过,这个子类对象就是代理对象,所以使用CGLIB生成动态代理,要求目标必须能够被继承,即不能是final的类
查看全文
99%的人还看了
相似问题
- YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
- 036、目标检测-锚框
- python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
- 【目标测距】雷达投影测距
- OpenCV入门9——目标识别(车辆统计)
- [架构之路-247]:目标系统 - 设计方法 - 软件工程 - 结构化方法的基本思想、本质、特点以及在软件开发、在生活中的应用
- 目标分割技术-语义分割总览
- C++二分算法:找到最接近目标值的函数值
- 第五章 目标检测中K-means聚类生成Anchor box(工具)
- 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv 计算机竞赛
猜你感兴趣
版权申明
本文"基于Java的设计模式 - 代理模式":http://eshow365.cn/6-9155-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 产品解读 | 分布式多模数据库:KaiwuDB
- 下一篇: Vue3函数式编程