代理模式3.ppt_第1页
代理模式3.ppt_第2页
代理模式3.ppt_第3页
代理模式3.ppt_第4页
代理模式3.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

代理模式 Proxy 理想信息技术研究院杨聪Blog congyang co cc 代理签证服装代理商代理服务器 日常生活中的代理 考虑这样一个实际应用 要一次性访问多条数据 这个功能的背景是这样的 在一个HR 人力资源 应用项目中客户提出 当选择一个部门或是分公司的时候 要把这个部门或者分公司下的所有员工都显示出来 而且不要翻页 方便他们进行业务处理 在显示全部员工的时候 只需要显示名称即可 但是也需要提供如下功能 在必要的时候可以选择并查看某位员工的详细信息 客户方是一个集团公司 有些部门或者分公司可能有好几百人 不让翻页 也就是要求一次性地获取这么多条数据并展示出来 该怎么实现呢 场景问题 场景问题 不用模式的解决方案 相信很多同学都会很快想到一条sql语句来实现该功能 Stringsql select from用户表 部门表 where用户表 depId 部门表 depId and部门表 depIdlike 用户选择查看的DepId 为了方便获取某个部门或者某个分公司下的所有员工信息 设计部门编号的时候 是按照层级来进行编码的 比如 上一级部门的编码为 01 那么本级的编码就是 0101 0102 下一级的编码是 010101 010102 这种设计方式 从设计上看虽然不够优雅 但是实用 像这种获取某个部门或者某个分公司下的所有员工信息的功能 就不用递归查找了 直接使用like 只要找到以该编号开头的所有部门就可以了 有何问题 上面的实现看起来简单 功能也正确 但是蕴含一个较大的问题 当一次性访问的数据条数过多 而且每条描述deeply数据量又很大的话 将会消耗很多内存 那么该怎么办呢 才能即把多条用户数据的姓名显示出来 而又能节省内存空间 当然还要实现在用户想要看到更多数据的时候 能正确访问到数据呢 解决方案 使用代理模式 1 代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问 2 以上问题的解决思路 让我们仔细分析上面的问题 一次性访问多条数据 这个可能性是很难避免的 是客户的需要 也就是说 要想节省内存 就不能从减少数据条数入手了 那就只能减少每条数据的数据量上来考虑 代理模式的结构和说明 一种可能的代理结构对象图 使用代理模式重写示意图 1 N次查询 看完上面的示例 大家可能会发现 这种实现方式有一个潜在的问题 就是如果客户对每条用户数据都要求查看详细数据的话 那么总的查询数据库的次数会是1 N次之多 第一次查询 获取到N条数据的用户编号和姓名 然后展示给客户看 如果这个时候 客户对每条数据都点击查看的话 那么每一条数据都需要重新查询数据库 那么最后总的查询数据库的次数就是1 N次了 从上面的分析可以看出 这种做法最合适的场景就是 客户大多数情况下只需要查看用户编号和姓名 而少量的数据需要查看那详细数据 这样即节省了内存 又减少了操作数据库的次数 模式讲解 认识代理模式 代理模式是通过创建一个代理对象 用这个代理对象去代表真实的对象 客户端得到这个代理对象后 对客户端没有什么影响 就跟得到了真是对象一样来使用 代理的分类 虚代理 远程代理 copy on write代理 保护代理 Cache代理 防火墙代理 同步代理 智能指引 在这些代理类型中 最常见的是虚代理 保护代理 远程代理和智能指引这几种 我们今天主要讨论需代理和保护代理 这两种代理也是在实际开发中使用频率最高的两种代理 具体目标和代理的关系 从代理模式的结构图看来 好像是有一个具体目标就有一个代理类 其实不是这样的 如果代理类能完全通过接口来操作它所代理的目标对象 那么代理对象就不需要知道具体的目标对象 这样就无须为每一个具体目标类创建一个代理类了 但是 如果代理类必须要实例化它代理的目标对象 那么代理类就必须知道具体被代理的对象 这种情况下 一个具体目标类通常会有一个代码类 这种情况多出现在虚代理情况中 代理模式调用顺序示意图 保护代理 示例需求 现在有一个订单系统 要求是 一旦订单被创建 只有订单的创建人才可以修改订单中的数据 其他人则不能修改 相当于现在如果有了一个订单对象实例 那么就需要控制外部对它的访问 满足条件的可以访问 不满足条件的就不能访问 定义 保护代理是一种控制对原始对象访问的代理 多用于对象应该有不同的访问权限的时候 保护代理会检查调用者是否具有请求所必需访问权限 如果没有相应的权限 那么就不会调用目标对象 从而实现对目标对象的保护 保护代理系统结构示意图 Java中的代理 Java对代理模式提供了内建的支持 在java lang reflect包下面 提供了一个Proxy的类和一个InvocationHandler的接口 通常把前面自己实现的代理模式称为Java的静态代理 通常把使用Java内建的对代理模式支持的功能来实现的代理称为Java的动态代理 动态代理跟静态代理相比 明显的变化是 静态代理实现的时候 在Subject接口上定义很多的方法 代理类里面自然也要实现很多方法 动态代理实现的时候 虽然Subject接口上定义了很多方法 但是动态代理类始终只有一个invoke方法 这样 当Subject接口发生变化的时候 动态代理的接口就不需要跟着变化了 Java动态代理系统结构 代理模式的特点 远程代理 隐藏了一个对象存在于不同的地址空间的事实 也即使客户通过远程代理去访问一个对象 虚代理 可以根据需要来创建 大对象 只有到必须创建对象的时候 需代理才会创建对象 从而大大加快程序运行速度 节省资源 通过虚代理可以对系统进行优化 保护代理 可以在访问一个对象前后 执行很多附加的操作 除了进行权限控制之外 还可以进行很多跟业务相关的处理 而不需要修改被代理的对象 也就是说 可以通过代理给目标对象增加功能 智能指引 和保护代理类似 也是允许在访问一个对象的前后 执行很多附加的操作 这样一来可以做很多额外的事情 例如 引用计数等 代理模式在客户和被客户访问的对象之间 引入了一定程度的间接性 客户是直接使用代理 让代理与被访问的对象进行交互 不同的代理类型 这种附加的间接性有不同的用途 也就具有不同的特点 思考代理模式 代理模式的本质 从实现上看 代理模式主要是使用对象的组合和委托 尤其是在静态代理的实现里面 会看得更清楚 但是也可以采用对象继承的方式来实现代理 这种实现方式在某些情况下 比使用对象组合还要来得快 代理模式的本质 控制对象访问 举例 改造保护代理代码 ProtectProxy 为对象继承方式实现代理 思考代理模式 代理模式的本质 思考代理模式 何时选用代理模式 需要为一个对象在不同的地址空间提供局部代表的时候 可以使用远程代理 需要按照需要创建开销很大的对象的时候 可以使用虚代理 需要控制对原始对象的访问的时候 可以使用保护代理 需要在访问对象执行一些附加操作的时候 可以使用智能指引代理 代理模式与其他模式的比较 代理模式与适配器模式 相似性 它们都为一个对象提供间接性的访问 而且都是从自身以外的一个接口向这个对象转发请求 不同性 功能上 两个模式是不一样的 适配器模式主要用来解决接口之间不匹配的问题 它通常是为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论