当前位置: 首页 > news >正文

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

目录

一、静态代理

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.mrgr.cn/news/7562.html

相关文章:

  • Godot《躲避小兵》实战之创建游戏主场景
  • 灵活升级与降级:轻松切换EC2实例类型的最佳实践
  • Java编程:单一职责原则
  • 了解基准测试(benchmark test)
  • CISAW安全运维认证考试重点内容介绍
  • 微服务中不同的容错模式
  • AI引领边缘计算变革,打造嵌入式产业新未来
  • Java笔试面试题AI答之线程(6)
  • 华为od(D卷) 堆内存申请
  • Spring Boot 大数据处理实战:运用迭代器模式避免内存溢出
  • Android DropboxManagerService源码分析
  • C语言家教记录(八)
  • 【系统分析师】-综合知识-计算机网络与信息安全
  • tp5php7.4配置sqlserver问题汇总
  • 浅谈:搭建一个属于自己的网站+源码+售后过程
  • VSCODE 使用正则表达式匹配替换有规律的行
  • D - Pedometer AtCoder Beginner Contest 367
  • Python多线程与异步处理在HTTP请求中的应用方式
  • 深入理解工厂模式与策略模式:设计模式的灵活应用
  • Spring Boot 集成 swagger 3.0 指南