代理模式:静态代理和动态代理

devtools/2024/12/22 18:14:34/

目录

一、静态代理

1、优点

2、 缺点

3、示例

二、动态代理

1、优点

2、 缺点

3、示例

三、总结


在Java中,代理模式是一种结构型设计模式,它允许你在不改变目标对象代码的情况下,为目标对象提供一个代理对象,用以控制访问和增强功能。代理分为两种主要类型:静态代理和动态代理。

一、静态代理

静态代理是在编译时就确定了代理类的,开发者需要手动为每个被代理的类编写代理类。代理类会实现与被代理类相同的接口,并在其方法中调用被代理对象的方法。

1、优点

(1)简单:实现简单,直接在代理类中调用被代理类的方法。

(2)明确:静态代理的逻辑在编译时就被确定,便于理解和维护。

2、 缺点

(1)代码重复:如果有多个被代理类,开发者需要为每个类都写一个代理类,导致代码重复。
(2)灵活性差:无法针对不同的被代理类动态生成代理,使得代码的扩展性差。

3、示例
interface UserService {void addUser(String user);
}class UserServiceImpl implements UserService {public void addUser(String user) {System.out.println("Add user: " + user);}
}class UserServiceProxy implements UserService {private UserService userService;public UserServiceProxy(UserService userService) {this.userService = userService;}public void addUser(String user) {System.out.println("Logging: Adding user " + user);userService.addUser(user);}
}

二、动态代理

动态代理则是在运行时生成代理类,它允许在不编写具体代理类的情况下,为任意目标对象提供代理功能。在Java中,动态代理通常使用java.lang.reflect.Proxy类来实现。

1、优点

(1)灵活性高:动态代理可以在运行时为不同的对象生成代理,避免了重复代码的问题。
(2)通用性:只需要实现接口即可为任意类生成代理,增加系统的可扩展性。

2、 缺点

(1)复杂性:由于是在运行时生成的,需要使用反射,增加了复杂性。
(2)性能问题:相较于静态代理,动态代理可能会有轻微的性能开销。

3、示例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface UserService {void addUser(String user);
}class UserServiceImpl implements UserService {public void addUser(String user) {System.out.println("Add user: " + user);}
}class DynamicProxyHandler implements InvocationHandler {private Object target;public DynamicProxyHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Logging: Adding user " + args[0]);return method.invoke(target, args);}
}public class Main {public static void main(String[] args) {UserService userService = new UserServiceImpl();UserService proxyInstance = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new DynamicProxyHandler(userService));proxyInstance.addUser("Alice");}
}

三、总结

1、静态代理: 手动创建,简单易懂,但不够灵活、存在代码重复。

2、动态代理: 运行时生成,灵活性高,可以为任何对象生成代理,但实现复杂性增加。


http://www.ppmy.cn/devtools/97878.html

相关文章

别再无效清理微信内存啦,这才是正确清理内存的方式

微信作为我们日常生活中必不可少的社交工具,随着时间的积累,往往会占据手机大量宝贵的存储空间。 如何在保证重要信息不丢失的同时,有效地管理和清理微信中的垃圾文件和无用数据,成为了一个值得探讨的话题。 本文将从几个方面介…

yum小bug

这个错误是在克隆的机子上安装mysql时,查看有无mysql发现的 [rootwebserve-2 backup] # yum list installed | grep mysql Repository cr is listed more than once in the configuration Repository fasttrack is listed more than once in the configuration 这…

HarmonyOs透明弹窗(选择照片弹窗样式)

1.鸿蒙中需要实现一个如下图的弹窗 2.由上图中可以得出,只需要三个Text组件依次向下排列,弹窗背景设置透明即可,弹窗代码如下(仅展示弹窗样式): /**** 自定义选择图片弹窗** 外部定义需要导出*/ CustomDialog //自定义弹窗 export…

[数据集][目标检测]机械常用工具检测数据集VOC+YOLO格式4713张8类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4713 标注数量(xml文件个数):4713 标注数量(txt文件个数):4713 标注…

又是一年秋

24年对于我个人来讲可能是最没有记忆点的一年,又却是最混乱的一年... 直至疫情结束后无论是工作还是生活仿佛产生了很多变化,我相信很多普通的同龄人和我情况也类似,不过类似这样的牢骚文网上有很多,我也不参与不赘述了&#xff0…

C++中 >>

uint16_t m 0x1234;qDebug()<< QString::number((m >> 8),16); "12" 右移8位 uint16_t m 0x1234;qDebug()<< QString::number((m >> 4),16); 右移4位 "123" uint16_t m 0x1234;qDebug()<< QString::number(((m >&g…

C语言独特的三目运算符深度解析

[大师C语言]合集&#xff3b;大师C语言(第一篇)&#xff3d;C语言栈溢出背后的秘密&#xff3b;大师C语言(第二十五篇)&#xff3d;C语言字符串探秘&#xff3b;大师C语言(第二篇)&#xff3d;C语言main函数背后的秘密&#xff3b;大师C语言(第二十六篇)&#xff3d;C语言结构体…

VulnStack1-内网渗透记录

网络结构 kali192.168.20.145windows7192.168.20.148/192.168.52.1432008192.168.52.138Win2k3192.168.52.130 三台虚拟机IP初始状态固定为192.168.52.0/24网段&#xff0c;所以将仅主机模式的网卡设置为192.168.52.0/24网段 漏洞利用 phpStudy 首先查看windows7的web服务…