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

server/2024/9/22 23:13:20/

目录

一、静态代理

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/server/105061.html

相关文章

(24)(24.4) MultiWii/DJI/HDZero OSD (version 4.2 and later)(二)

文章目录 前言 2 未经WTFOS改装的DJI 2/V1/V2护目镜 3 参数说明 前言 除了基于本地 MSP 遥测的 OSD 显示外,在后来的型号中还添加了“自定义OSD”功能,允许显示和定位 ArduPilot 提供的任何或所有 OSD 信息面板以及警告、单位等。 2 未经WTFOS改装的…

开放世界目标检测:检测区分出未知物体

开放世界目标检测:检测区分出未知物体 01 Abstract 开放世界目标检测旨在识别未见过类别的目标,并在提供注释后逐步识别这些目标。与传统的只限于预定义类别的范式不同,这种设置承诺通过使用与类别无关的信息来持续且通用地估计目标性。然而…

Paimon Flink本地读取数据报错

1.idea本地读取paimon 用idea在本地读取paimon的表时需要添加的依赖除了官网提出的和hadoop相关的,paimon-flink之类相关的除外还需要其他额外依赖 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.tabl…

【设计模式】模块模式和桥接模式

模块模式 模块化模式最初被定义为在传统软件工程中为类提供私有和公共封装的一种方法。 能够使一个单独的对象拥有公共/私有的方法和变量,从而屏蔽来自全局作用域的特殊部分。这可以减少我们的函数名与在页面中其他脚本区域内定义的函数名冲突的可能性。 闭包&am…

Spring系列之Spring Cache缓存注解的使用

目录 一、概述 二、缓存注解 1、Cacheable 缓存结果 2、CachePut 更新缓存 3、CacheEvict 清除缓存 4、Caching 组合缓存(不常用) 5、CacheConfig 类级别缓存配置(不常用) 6、CacheResult 设置缓存超时(不常用…

数据采集-->kafka-->hdfs

数据采集到kafka flume: a1.sources r1 a1.channels c1a1.sources.r1.type TAILDIR a1.sources.r1.filegroups f1 a1.sources.r1.filegroups.f1 /opt/installs/flume1.9/job/a.log a1.sources.r1.positionFile /opt/installs/flume1.9/job/taildir-kafka.jsona1.channe…

【日常总结】阿里云:windows server 过一段时间登录不进去,或提示:出现身份验证错误。 无法连接到本地安全机构

场景 阿里云 : ESC系统:windows server 2022 问题 无法登录,或者登录浸提提示密码已过期 原因 密码设置了过期时间 解决方案 修改密码策略:密码设置永不过期 打开“本地安全策略”编辑器:运行 secpol.msc。 导航至“账户…

【leetcode】 27. 移除元素

题目: 题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行…