写点什么

趣学设计模式 - 代理模式

作者:ZuccRoger
  • 2022 年 5 月 11 日
  • 本文字数:1232 字

    阅读完需:约 4 分钟

title: 趣学设计模式-代理模式date: 2022-05-10 13:30:50tags: 原创categories:
- 设计模式
复制代码

定义

给某一个对象提供代理,并且由代理对象控制对原对象的引用,所以其核心类是代理类。

实现

以下是代理模式的结构图:


光说不练假把式


我们以书上的给的例子进行 code 一步一步敲代码

给出了调用者 Client 的代码

@Controllerpublic class Client {  @Autowired ProxySearcher proxySearcher;  @RequestMapping("/proxyMode/test")  public String main() {    String result = proxySearcher.doSearch("杨过", "小龙女");    return result;  }}
复制代码

这个是代理对象的

@Componentpublic class ProxySearcher implements Searcher {  // 维持一个对真实主题的引用  private RealSearcher searcher = new RealSearcher();  private AccessValidator validator;  private Logger logger;  @Override  public String doSearch(String userId, String keyword) {    // 如果身份验证成功,则执行查询    if (validate(userId)) {      // 调用真实主题对象的查询方法      String result = searcher.doSearch(userId, keyword);      // 记录查询日志      this.log(userId);      // 返回查询结果      return result;    } else {      return null;    }  }  // 创建访问验证对象并调用其validate()方法实现身份验证  public boolean validate(String userId) {    validator = new AccessValidator();    return validator.validate(userId);  }  // 创建日志记录对象并调用log()方法实现日志记录  public void log(String userId) {    logger = new Logger();    logger.log(userId);  }}
复制代码

最后是真实对象的

public class RealSearcher implements Searcher {  // 模拟查询商务信息  @Override  public String doSearch(String userId, String keyword) {    System.out.println("用户" + userId + "使用关键词" + keyword + "查询商务信息!");    return "返回具体内容";  }}
复制代码

输出结果

在数据库中验证用户杨过是否是合法用户?杨过登录成功!用户杨过使用关键词小龙女查询商务信息!更新数据库,用户杨过查询次数加1!
复制代码

静态代理

等待更新

动态代理

  1. jdk 的动态代理

    利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler 来处理。

  2. cglib 的动态代理

    是利用 asm 的开源包,对被代理对象类的 class 文件加载进来,通过修改其字节码生成的子类来处理。

应用场景

  1. 业务系统的非功能性需求开发

    监控、统计、限流、事物、幂、日志。



    如图中,当你去找代购购买商品的时候,代购作为代理者可以去验证你的身份并且有相应的日志记录。这些是和业务系统的非功能性的需求开发。

  2. RPC 以及缓存中

好处

代理模式可以去掉客户看不到的内容和服务或者增添额外客户需要的服务。

和装饰模式相比

源码链接🔗

  1. 商务查询代理模式demo

参考资料

  1. 代理模式

  2. 设计模式的艺术


发布于: 刚刚阅读数: 3
用户头像

ZuccRoger

关注

还未添加个人签名 2019.10.06 加入

还未添加个人简介

评论

发布
暂无评论
趣学设计模式-代理模式_ZuccRoger_InfoQ写作社区