10、代理模式
10、代理模式
为什么要学习代理模式?因为这就是SpringAOP的底层模式【SpringAOP和SpringMVC】
代理模式分类
-
静态代理
-
动态代理
10.1、静态代理
角色分析:
-
抽象角色:一般会使用接口和抽象类来实现
-
真实角色:被代理的角色
-
代理角色:代理的真实角色,代理真实角色后,我们会做一些附属操作
-
客户:访问代理角色的人
代码步骤:
-
接口
public interface Rent {
public void rent();
} -
真实角色
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要租房子");
}
} -
代理角色
public class proxy implements Rent{
private Host host;
public proxy() {
}
public proxy(Host host) {
this.host = host;
}
public void View(){
System.out.println("中介带你看房子");
}
public void hetong(){
System.out.println("中介带你签合同");
}
public void fare(){
System.out.println("中介收中介费");
}
@Override
public void rent() {
View();
host.rent();
hetong();
fare();
}
} -
客户
public class Client {
public static void main(String[] args) {
Host host = new Host();
proxy proxy = new proxy(host);
proxy.rent();
}
}代理模式的好处:
-
可以使真实角色的操作更加的纯粹,不会去关心一些其他的业务
-
公共部分交给代理角色,实现了分工
-
公共业务发生了扩展的时候,易于拓展,方便管理
缺点
-
一个真实的角色就会产生一个代理角色:代码量会翻倍,开发效率也会降低
-
-
-
10.2、动态代理
-
动态代理和静态代理的角色一样
-
动态代理是代理类自动生成的不是手写的
-
动态代理分成两类:基于接口的动态代理,基于类的动态代理
-
基于接口:JDK的动态代理
-
基于类: cglib
-
Java字节码实现:Javasist
-
动态代理的类Proxy 和实现InvocationHandler接口重写里面的invoke方法
我们可以将其抽象成一个工具类
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object invoke = method.invoke(target, args);
return invoke;
}
public void log(String method){
System.out.println("执行了"+method+"方法");
}
}
当用户在使用时 只需要实例化动态代理类执行里面的get方法,即可拿到该类的代理就可以使用真实角色的方法了
public class client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService);
UserService proxy = (UserService) pih.getProxy();
proxy.delete();
}
}
动态代理的好处:
-
可以使真实角色的操作更加的纯粹,不会去关心一些其他的业务
-
公共部分交给代理角色,实现了分工
-
公共业务发生了扩展的时候,易于拓展,方便管理
-
一个代理类代理的是一个接口,一般就是对应一个业务
-
一个动态代理类可以代理多个类,只要这个类实现了同一个接口,就可以被代理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)