《研磨设计模式》chap11 代理proxy模式
场景:需要查询所有用户数据,不能翻页都显示出来,只显示姓名,在需要的情况下,点击某个用户的姓名出现详细信息。
1. 正常编码:仅查询当前数据
public static void main(String[] args) throws Exception{UserManager userManager = new UserManager();Collection<UserModel> col = userManager.getUserByDepId("0101");System.out.println(col);}public class UserManager { /*** 根据部门编号来获取该部门下的所有人员* @param depId 部门编号* @return 该部门下的所有人员*/public Collection<UserModel> getUserByDepId(String depId)throws Exception{Collection<UserModel> col = new ArrayList<UserModel>();Connection conn = null;try{conn = this.getConnection();String sql = "select * from tbl_user u,tbl_dep d "+"where u.depId=d.depId and d.depId like ?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, depId+"%");ResultSet rs = pstmt.executeQuery();while(rs.next()){UserModel um = new UserModel();um.setUserId(rs.getString("userId"));um.setName(rs.getString("name"));um.setDepId(rs.getString("depId"));um.setSex(rs.getString("sex"));col.add(um);}rs.close();pstmt.close();}}
2. 代理模式简介
public interface Subject {/*** 示意方法:一个抽象的请求方法*/public void request();
}public class RealSubject implements Subject{ public void request() {//执行具体的功能处理}
}public class Proxy implements Subject{/*** 持有被代理的具体的目标对象*/private RealSubject realSubject=null;/*** 构造方法,传入被代理的具体的目标对象* @param realSubject 被代理的具体的目标对象*/public Proxy(RealSubject realSubject){this.realSubject = realSubject;} public void request() {//在转调具体的目标对象前,可以执行一些功能处理 //转调具体的目标对象的方法realSubject.request(); }
}
3. 用代理模式解决使用场景
public interface UserModelApi {public String getUserId();public void setUserId(String userId);public String getName();public void setName(String name);public String getDepId();public void setDepId(String depId);public String getSex();public void setSex(String sex);
}public class UserModel implements UserModelApi{ private String userId; //用户编号 private String name; //用户姓名 private String depId;//部门编号...
}public class Proxy implements UserModelApi{ private UserModel realSubject=null;//持有被代理的具体的目标对象 public Proxy(UserModel realSubject){//传入被代理的具体的目标对象this.realSubject = realSubject;} private boolean loaded = false;//标示是否已经重新装载过数据了public String getDepId() { if(!this.loaded){ //需要判断是否已经装载过了reload(); this.loaded = true;}return realSubject.getDepId();} //重新查询数据库以获取完整的用户数据private void reload(){try{conn = this.getConnection();String sql = "select * from tbl_user where userId=? ";//查询所有PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, realSubject.getUserId()); ResultSet rs = pstmt.executeQuery();if(rs.next()){//只需要重新获取除了userId和name外的数据realSubject.setDepId(rs.getString("depId"));realSubject.setSex(rs.getString("sex"));} ...}public class UserManager { public Collection<UserModelApi> getUserByDepId(String depId)throws Exception{Collection<UserModelApi> col = new ArrayList<UserModelApi>();Connection conn = null;try{conn = this.getConnection();//只需要查询userId和name两个值就可以了String sql = "select u.userId,u.name "+"from tbl_user u,tbl_dep d "+"where u.depId=d.depId and d.depId like ?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, depId+"%");ResultSet rs = pstmt.executeQuery();while(rs.next()){//这里是创建的代理对象,而不是直接创建UserModel的对象Proxy proxy = new Proxy(new UserModel());//只是设置userId和name两个值就可以了proxy.setUserId(rs.getString("userId"));proxy.setName(rs.getString("name"));col.add(proxy);}rs.close();pstmt.close();
}
}
4. 总结:
代理模式在客户和被客户访问的对象之间,引入了一定程度的间接性,客户是直接使用代理,让代理来与被访问的对象进行交互。不同的代理类型,这种附加的间接性有不同的用途,也就具有不同的特点。
- 远程代理
隐藏了一个对象存在于不同的地址空间的事实,也即是客户通过远程代理去访问一个对象,根本就不关心这个对象在哪里,也不关心如何通过网络去访问到这个对象。从客户的角度来讲,它只是在使用代理对象而已。 - 虚代理
可以根据需要来创建“大”对象,只有到必须创建对象的时候,虚代理才会创建对象,从而大大加快程序运行速度,并节省资源。通过虚代理可以对系统进行优化。 - 保护代理
可以在访问一个对象的前后,执行很多附加的操作,除了进行权限控制之外,还可以进行很多跟业务相关的处理,而不需要修改被代理的对象。也就是说,可以通过代理来给目标对象增加功能。 - 智能指引
和保护代理类似,也是允许在访问一个对象的前后,执行很多附加的操作,这样一来就可以做很多额外的事情,比如,引用计数等。
《研磨设计模式》chap11 代理proxy模式相关推荐
- 当Android遇上设计模式之代理(Proxy)模式
文章目录 1. 代理模式 1.1 代码实现 1.2 使用场景 2. 静态代理与动态代理 设计模式六大原则: 单一职责原则:就一个类仅有一个引起它变化的原因,即类承担的职责单一性: 开放封闭原则:类.模 ...
- Head First 设计模式 —— 13. 代理 (Proxy) 模式
思考题 如何设计一个支持远程方法调用的系统?你要怎样才能让开发人员不用写太多代码?让远程调用看起来像本地调用一样,毫无瑕疵? P435 已经接触过 RPC 了,所以就很容易知道具体流程:客户端调用目标 ...
- 设计模式学习笔记——代理(Proxy)模式
设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...
- 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)
简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1 场景问题 ...
- Java二十三种设计模式 之代理(proxy)
Java二十三种设计模式 之代理(proxy) 今天我们学习一下静态代理和动态代理 我们来看代码(写一个坦克运行了多少时间): 第一种方法: public calss Tank implements ...
- 设计模式---代理(Proxy)模式
1 定义 代理模式,为想要访问的对象创建一个代理,使访问原对象变为访问代理对象.代理模式可以提供非常好的访问控制.生活中最多的代理模式例子就是中介. 2 代理模式结构与实现 代理模式通用类图如下所示( ...
- 代理(Proxy)模式 vs. 代理(Agency)机构
有一天,我将设计模式中的代理模式和我们社会中的代理机构联系起来.发现他们之间有非常多的相似的地方,而且可以互相借鉴. 在讨论这个话题之前,我的老板就率先指出了我的缺点.代理是Proxy不是Agency ...
- 设计模式--代理(Proxy)模式
模式定义 为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问 类图 要点总结 "增加一层间接层"是软件系统中对许多复杂问题的一种常见解决方法,在面向对象系统中,直接使用 ...
- Java 代理(proxy)模式
代理模式(Proxy Pattern) 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...
最新文章
- JDBC操作之连接和关闭mysql数据库
- 虚拟机上的ubuntu安装vmware tools
- 如何清除word复制过来的文字背景色的好方法?
- Spring Boot的快速入门
- 生信宝典,生物信息学习资源
- 物理服务器转虚拟路径,服务器配置虚拟路径
- vc对图像进行平移,转置等几何变换
- 一部分 数据 迁移_yugong异构数据库迁移与同步
- PROTEL 99 使用之添加库
- dcdc 国产 电源芯片电路方案 选型小体积大功率高性价比推荐 不定期更新中..
- demo:用matlab app designer做一个简易app
- 实验吧-密码学-奇妙的音乐(盲文密码)
- Linux 根文件系统的制作(busybox)
- 分享一个强大的网盘搜索平台-猪猪盘
- 利用高德地图周边搜索api获取不同类型的餐厅推荐
- LoRa:SX1278
- [WinAPI]通过Windows系统CLSID(GUID)打开系统指定窗口,及部分[上帝模式]命令
- 关于人像后期处理基础的相关技术步骤
- doctor技术基础
- 网络隔离环境下的跨网数据传输,如何保障安全性?
热门文章
- Android --- ERROR: Failed to resolve: xxx Affected Modules: xxx
- js基础--获取浏览器当前页面的滚动条高度的兼容写法
- 储能系统进入数据中心是大势所趋
- 5G与数据中心是新基建“耗电双雄”?事情不能这么看……
- 建设世界级数据中心正当时
- 成功解决ValueError: row index was 65536, not allowed by .xls format
- AI:2020年6月21日北京智源大会演讲分享之15:15-15:40黄萱菁教授《自然语言处理中的表示学习》
- 成功解决pandas\core\generic.py:3660: SettingWithCopyWarning: A value is trying to be set on a copy of a
- ML之分类预测之LARS:利用回归工具将二分类转为回归问题并采用LARS算法构建分类器
- ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注