假如要理解代理模式,首先我们要知道它的定义。也就是代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
然后怎样理解这个定义呢?
代理模式用于构造具有解耦组件的分布式系统。这些组件可以通过远程服务调用彼此交互。代理组件负责组件之间的通信协调。服务器将其功能(服务和特征)发布给代理。客户端从代理请求服务,然后代理将客户端重定向到其注册中心的适当服务。代理者(Broker)模式可以用于构建带有隔离组件的分布式软件,该软件通过远程服务调用进行交互。
有哪些优点呢?
(1).职责清晰真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性
同时存在的缺点:
(1) 因为在客户端和真实主题之间增加了代理对象所以有些类型的代理模式可能会造成请求的处理速度变慢。
(2) 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂。
那么又有哪些使用场景呢?
在客户端不能直接访问组件的情况下,通过代理组件进行访问。大致的使用环境,分为一下三类:1.直接访问IP或者组件不安全;2.访问次数特别多;3.对某些网站没有访问权限。
我们要解决哪些问题呢?
在环境处于情况1时,会有以下几个问题:在访问某些网站时,不想透露自己真实的IP,上网者也希望通过这种方法隐藏自己的IP,免受攻击;对组件直接访问不安全。在环境处于情况2时,会有以下几个问题:对组件的无限制访问低效,需要控制机制(代理模式)。在环境处于情况3时,会有以下几个问题:自身IP访问受限,希望突破自身IP访问限制,访问不能访问的站点,例如一些教育网站。单位或团体资源无法访问,如某大学FTP(前提是该代理地址在该资源 的允许访问范围之内)。使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
我们又有哪些解决方案呢?
让客户机通过组件代表访问,而不是通过组件本身进行访问,这种中间的代表组件就是代理,代理提供了原件相同的接口,而且保证了对原件的正确访问,为了完成这种功能,代理保持对它所表示的原件的作用。
有哪些实例呢?
实例一:假设要做一个电子商务的系统,这个系统无疑需要展示商品、提供购买流程。同时这个系统也需要有针对供应商的订货、发货、入账等流程。除了交易处理,还需要有评价系统管理信用;统计和推荐系统增加销售量;用户帐号系统保障安全和便利等等。这些模块和功能一般比较复杂,但是一般涉及到买家和卖家两个角色,因此往往根据这个规则,划定了两类模块,分别实施其功能,最后通过一个数据平台来存储这些数据。
实例二:比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。
一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。另一种情况虽然你所要调用的对象就在本地,但是由于调用非常耗时,你怕影响你正常的操作,所以特意找个代理来处理这种耗时情况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word用户等得可能早已经跳脚了,所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能。
附上代理模式结构图: