- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
代理模式(Proxy)在现实中,一个子系统或者一个组件不能或不应该被应用程序直接访问。例如,不是所有应用程序都有权使用某个组件(如某数据库)的服务,或检索一个组件提供的特殊信息。这就需要对服务和组件的访问进行保护和控制。代理设计模式是一种对某些组件进行访问控制和保护的模式。代理是一种在应用程序和访问对象之间建立的桥梁或关卡。通过代理的虚拟作用,达到控制对象访问的目的。使用代理往往有几种情况:1)被访问对象的资源由于地域、运行开销等因素的限制,不能获得对它的访问操作。例如,在远程网络中的资源,由于其规模或安全的限制,不能直接下载到本地计算机工作。只能通过一个本地的代理对象来实现对它的操作。几乎所有的数据库服务器,COM/DCOM 组件或CORBA组件等都是通过本地代理实现对其资源的访问的。这就如同大公司的代理公司。2)被访问的对象结构比较复杂或多变时,例如,对异构数据资源的访问。由于应用端不可能把握资源的细节情况,只能由代理根据应用请求的性质,智能性地确定访问操作的执行。此时,代理起到一种分析、决策、组织和协调的作用,为应用程序提供了统一的服务接口。而访问操作的复杂性由代理解决。此时代理如同生活中的咨询和服务公司。3)出于某种安全的考虑,需要隐藏被访问对象的标识时,这时就需要一个公开的代理,并在它的掩护下完成对实际对象的访问操作。Internet代理服务商就属于这种代理模式。 由上可知,代理具有的特性和所起到的作用可以包:间接性、委托性、虚拟性、安全性、保护性、远程性和多源性。问题与方案 一个客户程序(应用程序)需要访问一个组件的服务。这种组件泛指普通的对象,外部数据库或者万维网上的一个网页等。直接访问在技术上是可行的,但通常不是最好的途径。直接访问组件在许多情况下是不合适的。如:一般不想把组件的物理地址强制编码到客户程序中。又如公司工程人员经常查询数据库以得到必要的资料、数据或蓝图,每次远程访问可能代价昂贵,而许多访问都是相似的或重复的。对远程组件的直接和无限制的访问常常是低效的和不安全的。因此需要对访问进行控制,从而引入了代理。 代理设计模式是使客户程序与组件代表通信而不是与组件本身直接通信,这种代表称为代理(proxy)。它提供了组件接口并执行附加的前期和后期处理,例如访问控制检查,制作原件的只读副本等。引入代理带来许多好处,如提高效率、易于存取和防止越权访问等。 引入代理结构时,应考虑下列要求: 1)对组件的访问应该是高效的,花费适当的,对客户程序和组件双方都是安全的。 2)客户程序通过代理访问组件应该是透明的、简单的、客户程序不必改变原先访问其他可直接访问组件的呼叫方法和语法。 3)客户程序应了解远程服务访问的性能和经济方面的代价。结构与行为 在代理的结构模式中,被客户应用程序访问的不再是孤立一个对象。而是具有特定关系的两个对象。一个充当另一个的代理。但是,对于客户程序来讲,这种代理关系是透明的。为此,代理模式的结构需要建立代理和被代理对象(称为原件)的特别连接关系。图1给出了代理模式的结构。 在图1中,客户程序需要访问Actual Object类的对象和它的服务方法Service()。但是这种访问需要通过其代理Proxy类对象。因此,Actual Object类和Proxy类的应该具有相同的访问接口。如果它们都从公共时Object类导出就可以满足这个要求。 但是Proxy 类和Actual Object类的具体实现是完全不同的。要做到这一点,就需要Proxy类的对象把对它的接口的访问,转移到问Actual Object类的对象中去具体实现。然后把执行的结果返回给客户程序。可见,除了具有公共接口外,两个类的内部结构和算法的实现是完全不同的。在图1中Proxy类数据成员包含的对Actual Object类的对象的引用就起到了转移操作请求的作用。下面简述代理结构典型的动态行为: 1)客户程序在执行他的任务中,要求代理结构实施一种服务。 2)代理接受新到来的服务请求,并对它进行前期处理。前期处理包括查找要求的原件地址或检查本地存储器,查看被请求的信息是否己在存储器中等。 3)若代理发现必须请求原件实现服务,则代理采用合适的通信协议和安全措施将该请求转发到原件。 4)原件接受代理发来的请求并实现它,然后原件将响应返送回代理。 5)代理接受响应,并在将响应送到客户程序之前(或后)实施附加的后期处理,如存储结果,撤销原件或释放一个资源锁。设计实现 1)为处理对一个组件(原件)的访问控制,为它确定应有的控制职责,并将这些职责放到一个独立的代理组件上。 2)引入一个抽象基类来详细说明代理和原件两种接口的共同部分,进而从这
文档评论(0)