实用 AI

可在线运行 AI 集合,涵盖 AI 文案生成、写作辅助、AI 绘图与照片修复、AI 配音、字幕生成、语音转录以及 AI 视频创作和数字人等多种 AI 服务

查看详情

代理模式

软件设计模式
2021-05-17 14:29 · 阅读时长3分钟
小课

代理模式是指给目标对象创建一个和它提供一样接口的中间层,我们可以在这个中间层对请求进行预处理或者善后处理,这个中间层就叫做代理,代理模式和对象适配器模式的结构有些相似,但是它们的作用不同。

当我们需要对目标对象的调用进行额外处理时,比如说以下场景。

  • 权限处理,当调用目标对象方法时,我们需要对调用者的身份进行确认,通过才可真正调用。
  • 添加日志记录,在调用目标方法前后添加日志记录。
  • 缓存结果,当需要对目标对象方法调用的结果进行缓存,在缓存有效时直接返回缓存。

还是以之前的搜索引擎SearchEngine为例,我们为现有的SearchEngine做一个缓存代理,如果有缓存则返回缓存,没有则执行搜索操作,并将结果缓存起来。

现有的ISearchEngine提供一个搜索方法,用于根据关键字搜索并返回结果,定义如下。

public interface ISearchEngine {
    String search(String text);
}

代理类也实现了ISearchEngine,并且内部持有一个实现搜索功能的ISearchEngine实例。

1public class CacheSearchEngine implements ISearchEngine {
2
3    private final ISearchEngine searchEngine;
4
5    public CacheSearchEngine(ISearchEngine searchEngine) {
6        this.searchEngine = searchEngine;
7    }
8
9    @Override
10    public String search(String text) {
11        String result = getCache(text);
12        if (result == null) {
13            result = searchEngine.search(text);
14            setCache(text, result);
15        }
16        return result;
17    }
18
19    private String getCache(String text) {
20        ...
21    }
22
23    private void setCache(String text, String result) {
24        ...
25    }
26}
总结

在代理模式中,代理和被代理的对象实现了同样的接口,代理对象持有被代理对象的引用。代理模式可以让我们在不修改代码的情况下,对原有的类进行扩展,做一些前置和后置的工作。

代理模式proxy设计模式