代理模式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)保护代理可控制用户的访问权限
- java代理模式1
- 代理模式1
- 代理模式1
- Java代理模式1 - 静态代理、动态代理
- java--代理模式原理1
- 代理模式小例子1
- 设计模式之代理模式 java (1)
- 一天一个设计模式(1): 代理模式
- 设计模式(1)--理解AOP(代理模式)
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- Mac上配置Android ADB环境变量
- Linux基础---->命令(四)
- java连接池(资源池)原理
- php创建一个对象??
- Maven生命周期
- 代理模式1
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)
- 如何巧妙使用PDF转换图片软件
- json工具类
- Android例子—简单定时后台线程的实现
- virtualenv python虚拟环境
- Unity3D 使用“Shift+Tab”和“Tab”键 上下切换 UGUI下 Dropdown和inputfield等控件的控制顺序
- zookeeper 集群重启之后无法使用
- linux下用phpize给PHP动态添加扩展