场景:需要查询所有用户数据,不能翻页都显示出来,只显示姓名,在需要的情况下,点击某个用户的姓名出现详细信息。

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模式相关推荐

  1. 当Android遇上设计模式之代理(Proxy)模式

    文章目录 1. 代理模式 1.1 代码实现 1.2 使用场景 2. 静态代理与动态代理 设计模式六大原则: 单一职责原则:就一个类仅有一个引起它变化的原因,即类承担的职责单一性: 开放封闭原则:类.模 ...

  2. Head First 设计模式 —— 13. 代理 (Proxy) 模式

    思考题 如何设计一个支持远程方法调用的系统?你要怎样才能让开发人员不用写太多代码?让远程调用看起来像本地调用一样,毫无瑕疵? P435 已经接触过 RPC 了,所以就很容易知道具体流程:客户端调用目标 ...

  3. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  4. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  5. Java二十三种设计模式 之代理(proxy)

    Java二十三种设计模式 之代理(proxy) 今天我们学习一下静态代理和动态代理 我们来看代码(写一个坦克运行了多少时间): 第一种方法: public calss Tank implements ...

  6. 设计模式---代理(Proxy)模式

    1 定义 代理模式,为想要访问的对象创建一个代理,使访问原对象变为访问代理对象.代理模式可以提供非常好的访问控制.生活中最多的代理模式例子就是中介. 2 代理模式结构与实现 代理模式通用类图如下所示( ...

  7. 代理(Proxy)模式 vs. 代理(Agency)机构

    有一天,我将设计模式中的代理模式和我们社会中的代理机构联系起来.发现他们之间有非常多的相似的地方,而且可以互相借鉴. 在讨论这个话题之前,我的老板就率先指出了我的缺点.代理是Proxy不是Agency ...

  8. 设计模式--代理(Proxy)模式

    模式定义 为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问 类图 要点总结 "增加一层间接层"是软件系统中对许多复杂问题的一种常见解决方法,在面向对象系统中,直接使用 ...

  9. Java 代理(proxy)模式

    代理模式(Proxy Pattern) 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...

最新文章

  1. JDBC操作之连接和关闭mysql数据库
  2. 虚拟机上的ubuntu安装vmware tools
  3. 如何清除word复制过来的文字背景色的好方法?
  4. Spring Boot的快速入门
  5. 生信宝典,生物信息学习资源
  6. 物理服务器转虚拟路径,服务器配置虚拟路径
  7. vc对图像进行平移,转置等几何变换
  8. 一部分 数据 迁移_yugong异构数据库迁移与同步
  9. PROTEL 99 使用之添加库
  10. dcdc 国产 电源芯片电路方案 选型小体积大功率高性价比推荐 不定期更新中..
  11. demo:用matlab app designer做一个简易app
  12. 实验吧-密码学-奇妙的音乐(盲文密码)
  13. Linux 根文件系统的制作(busybox)
  14. 分享一个强大的网盘搜索平台-猪猪盘
  15. 利用高德地图周边搜索api获取不同类型的餐厅推荐
  16. LoRa:SX1278
  17. [WinAPI]通过Windows系统CLSID(GUID)打开系统指定窗口,及部分[上帝模式]命令
  18. 关于人像后期处理基础的相关技术步骤
  19. doctor技术基础
  20. 网络隔离环境下的跨网数据传输,如何保障安全性?

热门文章

  1. Android --- ERROR: Failed to resolve: xxx Affected Modules: xxx
  2. js基础--获取浏览器当前页面的滚动条高度的兼容写法
  3. 储能系统进入数据中心是大势所趋
  4. 5G与数据中心是新基建“耗电双雄”?事情不能这么看……
  5. 建设世界级数据中心正当时
  6. 成功解决ValueError: row index was 65536, not allowed by .xls format
  7. AI:2020年6月21日北京智源大会演讲分享之15:15-15:40黄萱菁教授《自然语言处理中的表示学习》
  8. 成功解决pandas\core\generic.py:3660: SettingWithCopyWarning:  A value is trying to be set on a copy of a
  9. ML之分类预测之LARS:利用回归工具将二分类转为回归问题并采用LARS算法构建分类器
  10. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注