代理模式1

来源:互联网 发布:大连软件职业学院 编辑:程序博客网 时间:2024/05/22 06:43

1、代理模式

给某个对象提供一个代理,并由代理对象控制对原有对象的引用。

角色:

Subject(抽象主题):真实主题和代理类的共同接口,也是客户端访问的对象

RealSubject(真实主题):

Proxy(代理类)包含一个对真实主题对象的引用,会调用真实主题的方法

2、例子 :客户端对象  访问代理对象(身份验证 商务信息查询 日志记录)  代理对象访问真实对象(商务查询系统)

静态代理类:在编译器就已经知道就已经存在代理类的字节码文件,代理类和真实主题的关系就已经确定了,当抽象接口增加一个方法时,所有实现类都要实现这个方法,并且所有的代理类也要实现此方法

/**   * @Title: Run.java  * @Package proxy  * @Description: 代理模式* @author LingLee * @date 2017年3月31日 上午11:29:36  * @version V1.0   */   package proxy;import javax.naming.directory.SearchControls;/** * * @Title: Subject   * @Description: 抽象主题:声明代理类和真实主题的公共方法 */interface Subject{public String doSearch(String userid,String pass);}/** * * @Title: AccessValidator   * @Description: 业务类   身份验证   日志记录类  具体查询类 */class AccessValidator{public boolean validator(String userid){System.out.println("数据库中验证用户身份");if(userid.equals("XiaoMing")){System.out.println("'"+userid+"'登录成功");return true;}else{System.out.println("'"+userid+"'登录失败");return false;}}}class Logger{public void log(String userid){System.out.println("更新数据库,用户'"+userid+"'查询次数+1");}}/** * * @Title: RealSubject   * @Description: 真实主题:实现抽象主题 */class RealSubject implements Subject{public String doSearch(String userid,String key){System.out.println("用户'"+userid+"'使用关键词"+key+"查询商务信息");return "具体查询结果";}}/** * * @Title: Proxy   * @Description: 代理类: 实现主题接口  保持一个真实主题的引用  调用真实对象中的方法 */class Proxy implements Subject{private RealSubject rs=new RealSubject();private AccessValidator val;private Logger logger;public String doSearch(String userid,String key){//实现抽象主题中的方法if(validate(userid)){String result=rs.doSearch(userid, key);//调用真实主题中的方法log(userid);return result;}return null;}public boolean validate(String userid){val=new AccessValidator();return val.validator(userid);}public void log(String userid){logger=new Logger();logger.log(userid);}}/**    * @Title: Run    * @Description: TODO(用一句话描述该文件做什么)   */public class Run {public  static void main(String[] args){Subject s=new Proxy();//如果通过.xml文件传入参数,那么客户端可以不知道是代理还是真实主题String res=s.doSearch("XiaoMing","student");System.out.println(res);}}

数据库中验证用户身份'XiaoMing'登录成功用户'XiaoMing'使用关键词student查询商务信息更新数据库,用户'XiaoMing'查询次数+1具体查询结果


(2)动态代理

源码是在程序运行期间由jvm根据反射机制动态生成的,所以不存在代理类的字节码文件,代理类和真实主题的关系是在程序运行时确定的




3、具体代理模式

(1)远程代理(Remote Proxy) 为不同地址空间(可以是同一台主机也可是另外主机)的对象提供一个本地的代理对象。

(2)虚拟代理(Virtual Proxy)若需要创建一个资源消耗大的对象,先创建一个资源消耗小的对象来表示

(3)保护代理(Protect Proxy)控制用户对一个对象的访问权限

(4)缓冲代理(Cache Proxy)为某一个目标操作的结果提供临时的存储空间,以便多个客户端可共享这个结果

(5)智能引用代理(Smart Reference Proxy)一个对象被引用时提供一些额外操作,比如log

3、优点

(1)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度

(2)客户端可以针对抽象主题进行编程,增加和更换代理类无须修改源码,复合开闭原则

(3)远程代理为位于两个不同地址空间对象访问提供了一种实现机制

(4)虚拟代理通过一个消耗资源少的对象来代表一个消耗资源多的对象

(5)保护代理可控制用户的访问权限

0 0