- 代理的来源
- 为什么要有代理
你有一套房子要卖,但是你对房产的所有信息一律不同,于是你找到房产中介,来帮你处理这些琐碎的事情。
你今天工作很累了,不想自己做饭,于是你找了一家餐馆,由餐馆帮你买菜,洗菜,做饭。
- 什么是代理
房产中介,餐馆都是代理
- 什么时候用代理
- 你只想做饭,但懒得出门买菜
此时代理类只需要给我补充上买菜的功能就可以了
对应到我们程序设计的时候就是:除了当前类能够提供的功能外,我们还需要补充一些其他功能。最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来说,如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。
- 你在外地上班,买房子的人没法找你直接交易
此时代理类只要在内部调用我就可以了。
对应到我们程序设计的时候就是:客户端无法直接操作实际对象。那么为什么无法直接操作?一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。另一种情况虽然你所要调用的对象就在本地,但是由于调用非常耗时,你怕影响你正常的操作,所以特意找个代理来处理这种耗时情况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word用户等得可能早已经跳脚了,所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能。申明一下我只是猜可能Word是这么做的,具体到底怎么做的,俺也不知道。
- 代理模式
- 静态代理
- Subject
- Real
- Proxy
- Client
静态代理的弊端
- 静态代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
- 静态代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。
- 动态代理
不需要程序员手动编写代码为某个接口的任意实现方法生成代理,利用反射动态实现某个接口的任意实现的代理
- 重写InvocationHandler的invoke方法
途中红框处利用反射实现方法调用
- 得到动态代理
动态代理解决了静态代理的2个弊端。一个静态代理类只为一个接口代理,如果多个接口需要代理,那么就会需要多个代理类,动态代理实现了只需要编写少量代码,就可以为多个接口代理相同的内容。
- 代理的来源
08-25