




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java 设设计计模模式式之之 Proxy 代代理理 chris 发表于 2003 06 10 11 55 00 评论数 1 点击数 2 127 投票总得分 10 投票总人次 5 关键字 摘摘要要 工工具具箱箱 本站收藏 美味书签 投票评分 发表评论 复制链接 理解并使用设计模式 能够培养我们良好的面向对象编程习惯 同时在实际应用中 可以如鱼得水 享受游刃有余的乐趣 Proxy 是比较有用途的一种模式 而且变种较多 应用场合覆盖从小结构到整个系统的大结构 Pro xy 是代理的意思 我们也许有代理服务器等概念 代理概念可以解释为 在出发点到目的地之间有一 道中间层 意为代理 设计模式中定义 为其他对象提供一种代理以控制对这个对象的访问 为什么要使用 Proxy 1 授权机制 不同级别的用户对同一对象拥有不同的访问权利 如 Jive 论坛系统中 就使用 Proxy 进行授权机制控制 访问论坛有两种人 注册用户和游客 未注册用户 Jive 中就通过类似 ForumP roxy 这样的代理来控制这两种用户对论坛的访问权限 2 某个客户端不能直接操作到某个对象 但又必须和那个对象有所互动 举例两个具体情况 1 如果那个对象是一个是很大的图片 需要花费很长时间才能显示出来 那么当这个图片包含在文 档中时 使用编辑器或浏览器打开这个文档 打开文档必须很迅速 不能等待大图片处理完成 这时需 要做个图片 Proxy 来代替真正的图片 2 如果那个对象在 Internet 的某个远端服务器上 直接操作这个对象因为网络速度原因可能比较 慢 那我们可以先用 Proxy 来代替那个对象 总之原则是 对于开销很大的对象 只有在使用它时才创建 这个原则可以为我们节省很多宝贵的J ava 内存 所以 有些人认为 Java 耗费资源内存 我以为这和程序编制思路也有一定的关系 如何使用 Proxy 以 Jive 论坛系统为例 访问论坛系统的用户有多种类型 注册普通用户 论坛管理者 系统管理者 游客 注册普通用户才能发言 论坛管理者可以管理他被授权的论坛 系统管理者可以管理所有事务 等 这些权限划分和管理是使用Proxy 完成的 Forum 是 Jive 的核心接口 在 Forum 中陈列了有关论坛操作的主要行为 如论坛名称 论坛描述 的获取和修改 帖子发表删除编辑等 在 ForumPermissions 中定义了各种级别权限的用户 public class ForumPermissions implements Cacheable Permission to read object public static final int READ 0 Permission to administer the entire sytem public static final int SYSTEM ADMIN 1 Permission to administer a particular forum public static final int FORUM ADMIN 2 Permission to administer a particular user public static final int USER ADMIN 3 Permission to administer a particular group public static final int GROUP ADMIN 4 Permission to moderate threads public static final int MODERATE THREADS 5 Permission to create a new thread public static final int CREATE THREAD 6 Permission to create a new message public static final int CREATE MESSAGE 7 Permission to moderate messages public static final int MODERATE MESSAGES 8 public boolean isSystemOrForumAdmin return values FORUM ADMIN values SYSTEM ADMIN 因此 Forum 中各种操作权限是和 ForumPermissions 定义的用户级别有关系的 作为接口 Foru m 的实现 ForumProxy 正是将这种对应关系联系起来 比如 修改 Forum 的名称 只有论坛管理者 或系统管理者可以修改 代码如下 public class ForumProxy implements Forum private ForumPermissions permissions private Forum forum this authorization authorization public ForumProxy Forum forum Authorization authorization ForumPermissions permissions this forum forum this authorization authorization this permissions permissions public void setName String name throws UnauthorizedException ForumAlreadyExistsException 只有是系统或论坛管理者才可以修改名称 if permissions isSystemOrForumAdmin forum setName name else throw new UnauthorizedException 而 DbForum 才是接口 Forum 的真正实现 以修改论坛名称为例 public class DbForum implements Forum Cacheable public void setName String name throws ForumAlreadyExistsExcept ion this name name 这里真正将新名称保存到数据库中 saveToDb 凡是涉及到对论坛名称修改这一事件 其他程序都首先得和 ForumProxy 打交道 由 ForumProx y 决定是否有权限做某一样事情 ForumProxy 是个名副其实的 网关 安全代理系统 在平时应用中 无可避免总要涉及到系统的授权或安全体系 不管你有无意识的使用 Proxy 实际你 已经在使用 Proxy 了 我们继续结合 Jive 谈入深一点 下面要涉及到工厂模式了 如果你不了解工厂模式 请看我的另外一 篇文章 设计模式之 Factory 我们已经知道 使用 Forum 需要通过 ForumProxy Jive 中创建一个 Forum 是使用 Factory 模 式 有一个总的抽象类 ForumFactory 在这个抽象类中 调用 ForumFactory 是通过 getInstanc e 方法实现 这里使用了 Singleton 也是设计模式之一 由于介绍文章很多 我就不写了 看这里 getInstance 返回的是 ForumFactoryProxy 为什么不返回 ForumFactory 而返回 ForumFactory 的实现 ForumFactoryProxy 原因是明显的 需要通过代理确定是否有权限创建forum 在 ForumFactoryProxy 中我们看到代码如下 public class ForumFactoryProxy extends ForumFactory protected ForumFactory factory protected Authorization authorization protected ForumPermissions permissions public ForumFactoryProxy Authorization authorization ForumF actory factory ForumPermissions permissions this factory factory this authorization authorization this permissions permissions public Forum createForum String name String description throws UnauthorizedException ForumAlreadyExistsExcep tion 只有系统管理者才可以创建 forum if permissions get ForumPermissions SYSTEM ADMIN Forum newForum factory createForum name descriptio n return new ForumProxy newForum authorization permis sions else throw new UnauthorizedException 方法 createForum 返回的也是 ForumProxy Proxy 就象一道墙 其他程序只能和 Proxy 交互 操作 注意到这里有两个 Proxy ForumProxy 和 ForumFactoryProxy 代表两个不同的职责 使用 F orum 和创建 Forum 至于为什么将使用对象和创建对象分开 这也是为什么使用 Factory 模式的原因所在 是为了 封 装 分派 换句话说 尽可能功能单一化 方便维护修改 Jive 论坛系统中其他如帖子的创建和使用 都是按照 Forum 这个思路而来的 以上我们讨论了如何使用Proxy 进行授权机制的访问 Proxy 还可以对用户隐藏另外一种称为co py on write 的优化方式 拷贝一个庞大而复杂的对象是一个开销很大的操作 如果拷贝过程中 没 有对原来的对象有所修改 那么这样的拷贝开销就没有必要 用代理延迟这一拷贝过程 比如 我们有一个很大的 Collection 具体如 hashtable 有很多客户端会并发同时访问它 其中一 个特别的客户端要进行连续的数据获取 此时要求其他客户端不能再向hashtable 中增加或删除 东东 最直接的解决方案是 使用 collection 的 lock 让这特别的客户端获得这个lock 进行连续的数据 获取 然后再释放 lock public void foFetches Hashtable ht synchronized ht 具体的连续数据获取动作 但是这一办法可能锁住 Collection 会很长时间 这段时间 其他客户端就不能访问该Collection 了 第二个解决方案是 clone 这个 Collection 然后让连续的数据获取针对clone 出来的那个 Collec tion 操作 这个方案前提是 这个 Collection 是可 clone 的 而且必须有提供深度 clone 的方法 H ashtable 就提供了对自己的 clone 方法 但不是 Key 和 value 对象的 clone 关于 Clone 含义可 以参考专门文章 public void foFetches Hashtable ht Hashttable newht Hashtable ht clone 问题又来了 由于是针对 clone 出来的对象操作 如果原来的母体被其他客户端操作修改了 那么 对 clone 出来的对象操作就没有意义了 最后解决方案 我们可以等其他客户端修改完
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民族服饰课件展播
- 年度安全工作计划讲解
- 2025年儿科感染性疾病诊断与治疗实践考试答案及解析
- 天津市安全生产条例讲解
- 传媒企业新质生产力
- 2025年中医药学中药煎煮技术规范测验答案及解析
- 2025年皮肤科常见皮肤病鉴别诊断试卷答案及解析
- 2025年传染病学典型传染病诊断处理考核试卷答案及解析
- 2025年放射科影像学疾病诊断辨识试卷答案及解析
- 湖南工商职业学院单招测试题(附解析)英语
- 2025时政考试题及答案
- 2025-2026学年人教版(2024)小学美术一年级上册教学计划及进度表
- 河北省围场满族蒙古族自治县2025年上半年事业单位公开遴选试题含答案分析
- 超市安全知识培训课件模板
- 超星尔雅学习通《形势与政策(2025春)》章节测试及答案(全国)
- 2025年事业单位招聘考试时事政治考试题库附有答案
- 医院不良事件培训课件
- 统编版(2024)八年级上册历史全册教材问题参考答案
- 2025年中级消控笔试题目及答案
- 环境反应工程导论课件
- 2024年中国防锈油行业调查报告
评论
0/150
提交评论