设计模式之代理模式(Proxy)

简介:

1.场景

在一个HR(人力资源)应用项目中客户提出,当选择一个部门或是分公司的时候,要把这个部门或者分公司下的所有员工都显示出来,而且不使用分页,方便他们进行业务处理。在显示全部员工的时候, 只需要显示姓名即可,但是也需要提供如下功能:在必要的时候可以选择并查看某位员工的详细信息(user表中的所有字段)。

实现起来也非常简单,只需要查询对应deptid下的user表就可以了(这样进行的查询是全表查询,也就是会查询表中的所有字段)。但是实现看似简单,功能也正确,但是蕴涵了一个比较大的问题。那就是,一次性访问的数据条数过多,而且每条描述的数据量又很大,这样操作将会消耗较多的内存。而从用户的角度来说,有很大的随机性。客户有可能访问每一条客户端详细信息,也有可能一条都不访问。也就是说,一次性访问很多条数据,消耗了大量内存,但是消耗的内存很有可能是浪费掉的。客户有可能根本就不会去访问那么多数据,对于每条数据,客户只需要查看姓名而已。

那么该怎么实现,才能既把用户数据的姓名显示出来,而又能节省内存空间?当然还要实现在客户想要看到更多数据的时候,能够正确访问到数据呢?这就是我们接下来要讲的代理模式。

2.解决方案

2.1.代理模式的定义

为其他对象提供一种代理以控制对这个对象的访问。

2.2.代理模式的结构和说明

  • Proxy:代理对象,通常具有如下功能。实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象。保存一个指向具体目标对象的引用(代理对象中有具体对象的成员变量),可以在需要的时候调用具体的目标对象。可以控制对具体对象的访问,并可以负责创建和删除它。
  • Subject:具体接口,定义代理和具体对象的接口,这样就可以在任何使用具体目标对象的地方使用代理对象。
  • RealSubject:具体的目标对象,真正实现目标接口要求的功能。

在运行时一种可能的代理结构的对象图如下图所示

也就是在客户首先见到的是Subject接口。接口调用代理Proxy,然后代理再调用具体对象RealSubject。

3.使用代理重写实例

(1)用户数据对象接口,就是对用户数据对象属性进行操作的getter/setter方法。

UserModelApi.java

View Code

(2)定义了接口,需要让UserModel来实现它。

UserModel.java

View Code

(3)接下来定义代理对象

Proxy.java

View Code

(4)定义数据库连接对象

DBConnection.java

View Code

(5)在UserManager对象中,不再对表进行全表查询,而只查询userid和username字段。

UserManager.java

View Code

(6)测试客户端

Client.java

View Code

(7)运行结果:

用户编号:=user0001,用户姓名:=张三1
用户编号:=user0002,用户姓名:=张三2
用户编号:=user0003,用户姓名:=张三3
重新查询数据库获取完整的用户数据,userId==user0001
用户编号:=user0001,用户姓名:=张三1,所属部门:=010101
重新查询数据库获取完整的用户数据,userId==user0002
用户编号:=user0002,用户姓名:=张三2,所属部门:=010101
重新查询数据库获取完整的用户数据,userId==user0003
用户编号:=user0003,用户姓名:=张三3,所属部门:=010102

(8)总结说明:

如果只是访问用户编号和用户信命的数据,是不需要重新查询数据库的。只有当访问到这两个数据以外的数据的时候,才需要重新查询数据库以获得完整的数据。

(9)1+N次查询

上述实例存在一个潜在的问题,那就是如果客户对每条用户数据都要求查看详细数据的话,那么总的查询数据库的次数会是1+N次。

第一次查询,获得了N条数据的用户编号与姓名,然后展示给客户看。如果这个时候,客户对每条数据都点击查看详细信息的话,那么每一条数据都需要重新查询数据库,那么最后总的查询数据库的次数就是1+N次了。

ps:2012-4-11

本文实例中使用的是mysql数据库,其中所用到的两张表的结构与内容如下:

(1)tbl_user

View Code

(2)tbl_dept

View Code

代码实例的类图结构如下图所示:


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/11/25/2296921.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
设计模式
设计模式-代理模式
设计模式-代理模式
|
1月前
|
设计模式 JavaScript Java
设计模式——代理模式
一文讲清楚设计模式中的代理模式
21 0
设计模式——代理模式
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
1月前
|
设计模式 uml
设计模式之代理模式
设计模式之代理模式
|
1月前
|
设计模式 Arthas Java
【设计模式】代理模式
【设计模式】代理模式
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式 Dubbo Java
设计模式-代理模式
设计模式-代理模式
31 0
|
3月前
|
设计模式 缓存 安全
聊聊Java设计模式-代理模式
代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
62 1
|
3月前
|
设计模式
设计模式 | 代理模式
设计模式 | 代理模式
13 0
|
3月前
|
设计模式 Go 网络安全
Golang设计模式——21代理模式
Golang设计模式——21代理模式
23 0