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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

1、代理和中介

在设计模式中,两者是对不同的问题而提出的解决方案。

2、代理与访问控制

张三很忙,将一些事情让李四去打理,李四与张三的关系就是代理。

这样,张三就只需专注于必须自己做的事情,节约了时间,提升了工作效率。

啥事情可以不自己做?例如访问权限控制(张三是大Boss,不想过问一些芝麻小事,让助理李四处理就行了)。


3、动态与静态

静态实现时,代理类很多,代码啰嗦;
动态实现时,只有一个代理类,代码简洁,但用起来却比较麻烦一些。
(印象中,动态代理常与工厂模式结合在一起使用, 这样可以避免动态创建代理实例的麻烦。)

4、
和sorra一样,建议还是看看GoF的书吧,你所有的问题,书中都有答案。


帮主能否从编程的范畴举个例子来说明一下,比如一个典型的问题场景,来引入代理,或者动态代理,让人理解理解,这种场景,不代理会怎么样,代理又会得到什么好处?其实您说得现实中明星的例子,不难理解,只是放在编程范畴的话,对于解答为啥要代理这个问题,个人感觉,还不够贴切。

以前对java内存模型这个概念就理解得不好,直到看了深入理解java虚拟机一书中第十二章之后,才算是准确理解了一下这个概念,书上就是从并发处理讲起,大致意思是鉴于人类持续压榨计算机的运算能力,所以有人提出了并发处理,进而引出了多任务处理,也就是要求计算机同时做几件事情,那么为啥要同时让计算机做几件事情呢,根本原因在于一般来讲,计算机的运算速度与它自身的存储通讯子系统的速度差距太大,以致于计算机的大部分时间都处于等待状态,为了让它少些等待时间,所以有人就希望计算机能同时做几件事,反正就是让它少等待,多干活。但是一旦这样的话,又会出现这样一个问题,那就是多任务不仅仅需要处理器来计算,而且还需要与内存交互,保存中间结果,以致于他下次再接着完成之前未完全做完的计算任务不至于从头开始计算,但是前面说过了,计算机的存储设备与处理器的运算速度之间有个几个数量级的差距,所以现代计算机就不得不键入高速缓存来将中间结果先暂时缓存起来,这样就暂时解决了处理器与内存之间的速度差距,但是也引入了新的问题,缓存一致性问题。终于引出了最终的问题,那就是一致性的问题。一般来看,为了解决一致性的问题,需要各处理器访问缓存时都遵循一些协议,以保证对数据的读写不至于混乱,能够一致。这完全和java虚拟机内存模型中定义的内存访问操作和硬件访问操作是具有可比性的。由此在java领域也引出了java内存模型这个概念,先不谈java内存模型的具体内容,但但java内存模型产生的背景和它要解决的问题,大家是不是就可以通过上述的描述,有一个稍微清晰和准确的认识了呢?java内存模型就是为了屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果。有了这些知识的储备,再去深入研究java内存模型的具体内容和相关理论,是不是就更清晰更容易理解深入一些这些基础理论了呢?所以个人感觉,技术领域任何一种技术的产生,都是有它的具体背景和动机的,不会凭空产生,把握了这个原则去研究学习技术,我相信大家一定会在跋涉技术这座大山的路上少走弯路,早出成绩。


写的很清楚