本文的例子和部分内容均来自www.jdon.com的《GoF 23种设计模式》系列文章
一、Proxy模式的适用场合
1.授权机制
不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限.
2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
举例两个具体情况:
(1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
(2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
--摘自Jdon的《GoF 23种设计模式》
二、使用Proxy模式实现的授权机制
个人观点一
从isSystemOrForumAdmin()方法体中我们可以看到权限设计的一种方法:
·定义一个表示权限的类,在这个类中定义所有的权限条目(例如这里的FORUM_ADMIN),以数字表示
·在这个类中定义一个数组,用于表示一个用户所具有的所有权限的集合,数组的长度就是所有权限的数目总和
·使用诸如values[FORM_ADMIN]来获取用户是否具有某一项权限
三、对Jive论坛中Proxy模式使用的理解
个人观点二
Request --
(1)-->
ForumProxy --
(2)-->
ForumPermissions
| |
| <-----------
(3)------- | (权限验证通过)
| |
(访问)| -----------
(4)------> |
Form
从上面的代码段和这个流程图中我们可以看到Proxy模式实现权限验证的过程:
·请求都必须先经过Proxy
·Proxy类中包含了一个Permission类,用于获取当前用户所具有的权限
·Proxy类根据用户的权限将请求转发给真正的后台对象或拒绝请求
Proxy类具有几个特点
·
Proxy类一般都实现或继承了后台对象接口或抽象类,在其中实现了后台对象接口的方法,这样外界和代理类打交道的客户端看到的是和后台对象一样的接口。根本不知道自在和代理对象打交道。
·
Proxy类一般都含有一个后台对象作为其成员,因为代理类需要在其实现接口的方法中调用后台对象的真正方法来实现业务逻辑。
·
Proxy类一般都需要包含一个能够验证用户请求是否合法的对象,如上例中的ForumPermisssions类,作为转发或拒绝用户请求的判断依据
四、Jive论坛中Proxy模式与Factory模式的结合
个人观点三
Proxy结合Factory模式的实现流程
Request --(1)-- > ForumFactoryProxy --(2)-- > FourmPermissions
| |
| <----------- (3) ------------- | (验证通过)
| |
| ------------- (4) -----------> | ForumFactory
| |
Forum | <------------ (5) ------------ | (创建)
| |
(封装) | ------------- (6) -----------> | ForumProxy
可以看到这里有2个Proxy对象,一个是工厂的Proxy,一个是产品的Proxy,前者决定用户是否有权创建一个Forum,后者决定用户是否有权使用Forum。
但工厂创建出一个Form对象后,就将这个Forum对象和其它的对象传给ForumProxy对象,以后所有对Forum的访问和操作都由ForumProxy来代理。(参见个人观点二)
所以我们看到:假如我们不想让用户直接访问后台对象或需要设置不同的访问、操作权限,我们就可以使用Proxy模式
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-01-14 17:40
Paul Lin 阅读(1492)
评论(0) 编辑 收藏 所属分类:
模式与重构