代理模式是指给目标对象创建一个和它提供一样接口的中间层,我们可以在这个中间层对请求进行预处理或者善后处理,这个中间层就叫做代理
,代理模式和对象适配器模式的结构有些相似,但是它们的作用不同。
当我们需要对目标对象的调用进行额外处理时,比如说以下场景。
还是以之前的搜索引擎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}
在代理模式中,代理和被代理的对象实现了同样的接口,代理对象持有被代理对象的引用。代理模式可以让我们在不修改代码的情况下,对原有的类进行扩展,做一些前置和后置的工作。