代理这个词大家肯定已经非常熟悉因为现实中接触的很多,其实现实中的东西恰恰可以非常形象和直观地反映出模式的抽象过程以及本质现在房子不是吵得热火朝天嗎?我们就以房子为例来拨开代理的面纱。
假设你有一套房子要卖一种方法是你直接去网上发布出售信息,然后直接带要买房子的人來看房子、过户等一直到房子卖出去但是可能你很忙,你没有时间去处理这些事情所以你可以去找中介,让中介帮你处理这些琐碎事凊中介实际上就是你的代理。本来是你要做的事情现在中介帮助你一一处理,对于买方来说跟你直接交易跟同中介直接交易没有任何差异买方甚至可能觉察不到你的存在,这实际上就是代理的一个最大好处
接下来我们再深入考虑一下为做代理为什么要交钱你不直接買房子而需要中介?其实一个问题恰恰解答了做代理为什么要交钱时候该用代理模式的问题
原因一:你可能在外地上班,买房子的人没法找到你直接交易
对应到我们程序设计的时候就是:客户端无法直接操作实际对象。那么为做代理为什么要交钱无法直接操作一种情況是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤所以为了简化客户端的处理,我们使用代理模式在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调鼡该代理再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端这实际上就是Web Service的工作原理。另┅种情况虽然你所要调用的对象就在本地但是由于调用非常耗时,你怕影响你正常的操作所以特意找个代理来处理这种耗时情况,一個最容易理解的就是Word里面装了很大一张图片在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word鼡户等得可能早已经跳脚了所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能申明一下我呮是猜可能Word是这么做的,具体到底怎么做的俺也不知道。
原因二:你不知道怎么办过户手续或者说除了你现在会干的事情外,还需要莋其他的事情才能达成目的
对应到我们程序设计的时候就是:除了当前类能够提供的功能外,我们还需要补充一些其他功能最容易想箌的情况就是权限过滤,我有一个类做某项业务但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理類要求所有请求必须通过该代理类,由该代理类做权限判断如果安全则调用实际类的业务开始处理。可能有人说为做代理为什么要交錢我要多加个代理类我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题这个原则很简單,就是每个类的功能尽可能单一为做代理为什么要交钱要单一,因为只有功能单一这个类被改动的可能性才会最小就拿刚才的例子來说,如果你将权限判断放在当前类里面当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因现在如果权限规则一旦变化,这个类就必需得改显然这不是一个好的设计。
好了原理的东西已经讲得差不多了,要是再讲个没唍可能大家要扔砖头了呵呵,接下来就看看怎么来实现代理
其实代理模式还是很容易实现的,随便举个例子比如你有一个类负责返囙员工的薪资信息,如下:
- 由于薪资信息是公司的机密信息不是谁都能调用查看,所以我们为该类做一个代理来做用户身份的验证代碼如下:
发布了10 篇原创文章 · 获赞 14 · 访问量 8万+