为什么要用代理和动态代理

KenWT 12-02-14
         

做java的人想必都知道java里面有个动态代理机制吧,设计模式也有个代理模式,那么问题来了,在网上搜这些内容的帖子不是难事,但是我的问题是,想准确认识和理解这些内容,必须得准确搞懂这么一个问题,那就是为啥子要代理,还得动态代理,这个机制是在什么背景下产生的?它解决了什么核心问题?蕴藏这一种什么思想?带给我们什么启示?等等,很多问题,脑子一时转不过来了,所以再次在论坛向道友们求助,简单点说,就是为什么要代理?java里的这个动态代理是因何而产生的?希望大家多多赐教,先谢谢了
[该贴被admin于2012-02-14 19:26修改过]

         

27
banq
2012-02-14 16:56

至于为什么需要使用动态代理,我们从反面设想,不使用动态代理,那么就使用普通代理模式,普通代理模式的特点一对一,一个原始类,一个代理类,如果有N多个原始类,就有N多个代理类,可见原来Jive源码中是这样,结果造成代码琐碎,比如权限代理,要为每个原始类都建立一个其实内部内容都差不多的代理类。

那么动态代理正好解决这个问题,只要建立一个权限动态代理类,就能够为多个原始类进行代理。

这其中演变深深包含了面向“类”编程到面向“对象实例object instance”编程的转变。

真正代理其实应该是对象实例的代理,但是过去如果没有Java的语言级别提供动态代理库支持,那么我们只能转换为用代理类实现,这是一种妥协和让步。

不知说了这么多是否明白?

KenWT
2012-02-14 17:12

2012年02月14日 16:56 "@banq"的内容
至于为什么需要使用动态代理,我们从反面设想,不使用动态代理,那么就使用普通代理模式,普通代理模式的特点一对一,一个原始类,一个代理类,如果有N多个原始类,就有N多个代理类,可见原来Jive源码中是这样,结果造成代码琐碎,比如权限代理,要为每 ...



谢谢帮主的及时答疑,不过我想或许我没表述明白我的问题的本意,我问题的本意首先应该是为啥要代理,这是第一个问题,日常生活中的代理中介,就是为了解决业务相关双方直接交流的不便的问题而产生的,同时还可以提供比直接交流更多的功能。那么编程领域,尤其是Java语言编程范畴的代理产生的原因背景应该是什么呢?也就是什么样的场景下,让我们想到了非代理不行,即必须借助一个中间代理类来替代对目标类的访问和调用,难道也是因为某种不便?那么这种不便具体是些什么呢?再者,代理而且还可以细分到普通代理和动态代理?帮主应该回答了第二个问题,这是我自己没表达清楚的原因,谢谢帮主,希望能继续得到您的教导

sorra
2012-02-14 18:04

GoF<设计模式>一书中对代理模式有很好的介绍. 建议一阅.
它介绍了四种情况:
1.远程代理 Remote Proxy
通过代理来表示另一个地址空间中的对象
2.虚代理 Virtual Proxy
按需创建开销很大的对象. 常用于延迟加载.
3.保护代理 Protection Proxy
-控制对原始对象的访问.
-在访问对象时可以附加一些操作
4.智能指引 Smart Reference
-充当智能指针: 能自动释放所引用的对象
-在访问对象时可以附加一些操作

banq
2012-02-14 19:24

我来通俗解释一下为什么需要代理。

打个比喻,明星为什么需要经纪人来代理他呢?因为明星的专职是唱歌或演戏,如果把除此以外的其他事情比如演出费用谈判等等都揽在身上,他会累死。

这就是体现一个思想:专业分工,用面向对象术语说:就是职责分明。

所以,代理类一般是做些除原始类核心功能以外的其他功能,比如权限 事务等等都要专门的代理来实现。

当我们的代码每个类代表一个主要功能,而不是将所有功能混在一个类中,那么代码无疑清晰有条理的,易于维护,比如我要修改权限,就不必打开原始类代码,直接修改权限代理类就可以了。就很少发生修改一个BUG,带来一个新BUG的烦恼问题。

No matter how slow you are writing clean code, you will always be slower if you make a mess 写干净的代码无论有多慢,总是快于把代码写得一团糟。

2Go 1 2 下一页