【计划模式】署理模式

[复制链接]
发表于 2025-10-2 15:57:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
简介
假设你在网上购物时,快递员无法直接将包裹送到你手中(比如你不在家)。
署理模式的办理方案是:
快递员将包裹交给小区代收点(署理),代收点取代你控制和管理包裹的访问。
代收点可以添加额外功能:比如验证你的身份、暂存包裹直到你有空取件。
你终极通过代收点间接拿到包裹,整个过程掩护了你的隐私和便利性。
实用场景
长途署理:访问长途对象(如网络服务调用)。
假造署理:延长创建开销大的对象(如图片懒加载)。
掩护署理:控制权限(如接口访问权限验证)。
日志日志署理:记载方法调用信息(如监控监控体系)。
长处
隔离目标对象与客户端,加强安全性。
在不修改目标对象的条件下扩展功能。
缺点
增长代码复杂度(需额外署理类)。
大概低落体系相应速率(署理层处理惩罚逻辑)。
类图

代码
  1. // 抽象主题:用户网购行为
  2. interface Shopping {
  3. void receivePackage(String packageName);
  4. }
  5. // 真实主题:快递直接送货
  6. class CourierDelivery implements Shopping {
  7. @Override
  8. public void receivePackage(String packageName) {
  9. System.out.println("快递员已将包裹[" + packageName + "]送到用户手中!");
  10. }
  11. }
  12. // 代理类:代收点暂存包裹
  13. class ParcelLockerProxy implements Shopping {
  14. private Shopping courier;
  15. private String pendingPackage;
  16. public ParcelLockerProxy() {
  17. this.courier = new CourierDelivery();
  18. }
  19. @Override
  20. public void receivePackage(String packageName) {
  21. // 代理控制访问:暂存包裹,延迟通知用户
  22. System.out.println("代收点暂存包裹[" + packageName + "],等待用户取件");
  23. this.pendingPackage = packageName;
  24. notifyUser();
  25. }
  26. private void notifyUser() {
  27. // 模拟延迟通知
  28. System.out.println("短信通知:您的包裹已到代收点,请及时领取!");
  29. }
  30. }
  31. // 客户端
  32. public class ProxyDemo {
  33. public static void main(String[] args) {
  34. // 直接访问真实对象
  35. Shopping courier = new CourierDelivery();
  36. courier.receivePackage("手机");
  37. // 通过代理访问
  38. Shopping proxy = new ParcelLockerProxy();
  39. proxy.receivePackage("电脑");
  40. }
  41. }
复制代码
现实场景
Spring 框架利用动态署理实现面向切面编程(AOP),比方变乱管理,日志日志署理。
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. // 接口:用户服务
  5. interface UserService {
  6. void addUser(String name);
  7. }
  8. // 真实主题:用户服务实现
  9. class UserServiceImpl implements UserService {
  10. @Override
  11. public void addUser(String name) {
  12. System.out.println("添加用户: " + name);
  13. }
  14. }
  15. // 动态代理:日志日志增强
  16. class LoggingProxy implements InvocationHandler {
  17. private Object target;
  18. public LoggingProxy(Object target) {
  19. this.target = target;
  20. }
  21. @Override
  22. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  23. System.out.println("调用方法前记录日志: " + method.getName());
  24. Object result = method.invoke(target, args);
  25. System.out.println("调用方法后记录日志: " + method.getName());
  26. return result;
  27. }
  28. }
  29. // 客户端
  30. public class DynamicProxyDemo {
  31. public static void main(String[] args) {
  32. UserService realService = new UserServiceImpl();
  33. UserService proxy = (UserService) Proxy.newProxyInstance(
  34. realService.getClass().getClassLoader(),
  35. realService.getClass().getInterfaces(),
  36. new LoggingProxy(realService)
  37. );
  38. proxy.addUser("张三");
  39. }
  40. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表