为什么要使用动态代理呢? 我们从反面设想,不使用动态代理,那么就使用普通代理模式,普通代理模式的特点一对一,一个原始类,一个代理类,如果有N多个原始类,
就有N多个代理类,结果造成代码琐碎,比如权限代理,要为每个原始类都建立一个其实内部内容都差不多的代理类。
那么动态代理正好解决这个问题,只要建立一个权限动态代理类,就能够为多个原始类进行代理。
这其中演变深深包含了面向“类”编程到面向“对象实例object instance”编程的转变。
真正代理其实应该是对象实例的代理,但是过去如果没有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
写干净的代码无论有多慢,总是快于把代码写得一团糟。