设计模式学习笔记(五)之代理模式(Proxy):
1:定义与作用:为其他对象提供一种代理以控制对这个对象的访问。
2:代理模式一般涉及到的角色有以下三个:
- 抽象角色:声明真实对象和代理对象的共同接口;
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装;
- 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象;
从上面的结构类图可以看出,代理类(Proxy)和真实角色类(RealSubject)都实现了抽象角色类,这样由于 Proxy 和 RealSubject 均实现自 Subject 这个抽象角色类,并且在 Proxy 和 RealSubject 中均实现了 Request 方法,所以在需要使用 RealSubject 的地方便可以使用 Proxy 来替代,由于使用了 Proxy 来替代 RealSubject ,所以便实现了通过 Proxy 来代理 RealSubject ;看还是挺好理解的吧(*^__^*)
4:下面我们使用租房子的一个小例子来模拟代理模式
(在其中:房子的主人为:真实角色RealSubject;中介为:代理角色Proxy;作为要去租房子的我们,我们平时一般见不到房子的主人,此时我们去找中介,让中介直接和找房主交涉,把房子租下来,直接跟租房子打交道的是中介。中介就是在租房子的过程中的代理者),看下结构图:
下面来看代码:
①:抽象角色:Rent.java
package com.jiangqq.proxy1; //抽象角色,定义真实角色和代理角色的共同接口 public interface Rent { public void order(); }
②:真实角色类:RentReal.java
package com.jiangqq.proxy1; //真实角色,去执行确定房子租 public class RentReal implements Rent { @Override public void order() { System.out.println("租房子OK...."); } }
③:代理角色类:RentProxy.java
package com.jiangqq.proxy1; //代理角色,在代理角色内部,使用真实角色的应用去执行自己的order()角色,这样租房子 public class RentProxy implements Rent { //在代理的角色的内部去引用真实的角色 private RentReal realSubject; @Override public void order() { if(realSubject==null) { realSubject=new RentReal(); beforeProxy(); //使用真实角色去完成所需要的事情 realSubject.order(); afterProxy(); } } //真实角色的操作之前去执行,不是必须要有 private void beforeProxy() { System.out.println("beforeProxy..."); } //真实角色的操作之后去执行,不是必须要有 private void afterProxy() { System.out.println("afterProxy..."); } }
④:客户端测试类代码:
package com.jiangqq.proxy1; //代理模式的测试客户端 public class Client { public static void main(String[] args) { Rent proxySubject=new RentProxy(); proxySubject.order(); } }
Client执行的结果如下:
看上面的代码,我们可以清楚的看出来,在客户端实际调用的是RentReal(真实角色)的order()方法,现在我们可以使用RentProxy(代理角色)去调用进行处理,当然我们大家都知道,作为中介肯定要赚钱来(话说不赚钱中介凭什么帮你去租房子呢?嘿嘿),所以我们看到在RentProxy.java中还定义了两个私有的方法,当然也可以不定义啦,就可以说此刻的中介的人真好,服务之后不收钱了,免费了一次,如果真这样,那这世界还真美好~~~
5:代理模式在实际情况中的应用(以下是我在《大话设计模式》书中摘录的):
①:远程代理:就是一个对象在不同的地址空间提供局域代表,这样可以掩盖一个对象存在不同地址空间的事实;
②:虚拟代理:就是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象;
③:安全代理:用来控制真实对象访问时的权限;
④:智能代理:是指调用真实的对象时,代理处理另外一些事情;
例子的代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4201822