代理模式,在UML类结构上很好理解, 不过在实际应用当中可能并不是很清楚代理模式应用在哪些场景里。这里给出《大话设计模式》中对代理模式应用场合的解释:
第一,远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
第三,安全代理,用来控制真实对象访问时的权限。
第四,智能指引,是指当调用真实对象的对象时,代理处理另外一些事。(这里和动态代理类似)
我们画出动态代理的UML类结构图。
可以看出代理模式的UML类结构非常简单。
真实实体和代理共有的接口代码如下:
1 package day_7_proxy;
2
3 /**
4 * 真实实体和代理共有的接口
5 * @author turbo
6 *
7 * 2016年9月11日
8 */
9 public interface Subject {
10
11 void request();
12 }
真实实体和代理类代码,在真实实体中做真正要做的动作,而在代理中并不需要做真正的动作,仅仅是调用真实实体的方法动作即可。
1 package day_7_proxy;
2
3 /**
4 * 真实实体
5 * @author turbo
6 *
7 * 2016年9月11日
8 */
9 public class RealSubject implements Subject {
10
11 /* (non-Javadoc)
12 * @see day_7_proxy.Subject#request()
13 */
14 @Override
15 public void request() {
16 System.out.println("真实的访问");
17 }
18
19 }
1 package day_7_proxy;
2
3 /**
4 * 代理类
5 * @author turbo
6 *
7 * 2016年9月11日
8 */
9 public class Proxy implements Subject {
10 private RealSubject realSubject;
11
12 /* (non-Javadoc)
13 * @see day_7_proxy.Subject#request()
14 */
15 @Override
16 public void request() {
17 if (realSubject == null){
18 realSubject = new RealSubject();
19 }
20
21 realSubject.request();
22 }
23
24 }
客户端代码:
1 package day_7_proxy;
2
3 /**
4 * @author turbo
5 *
6 * 2016年9月11日
7 */
8 public class Main {
9 public static void main(String[] args){
10 Proxy proxy = new Proxy();
11 proxy.request();
12 }
13 }
这样我们就简单的实现了一个代理模式。同样也没有详细深入的讲解,在以后会结合更加实际的代码,或者开源框架代码来实际领会代理模式的威力。
Java中还有一个动态代理,后面我们会说下这个动态代理是个什么东西。