JAVA设计模式1——代理模式

按照原计划是准备一直写《深入理解JAVA虚拟机》的读书笔记的,但是上一篇文章中,在制造方法区溢出的时候,原书的大致思路是:方法区中存储的是运行时的类信息,通过CGLIB代理生成大量的类,超过方法区的最大容量,就会产生溢出。

这里书中提到了一个词“CGLIB”,说实话,笔者也是听说过没用过(尴尬),于是百度之,“CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库”,再搜索一下博客,又发现了JDK动态代理,那么什么又是代理,就是今天要和大家探讨的——代理模式。

代理模式(Proxy Pattern)的定义:为另一个对象提供一个替身或占位符,以控制对这个对象的访问(Head First设计模式给出的定义)。

类图如下

JAVA设计模式1——代理模式


应用场景:当Client为了实现Subject的目标而直接访问RealSubject存在问题的时候(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),就需要Proxy来代替Subject来执行request操作。

这个定义太抽象了,不太容易理解。

让我们举个例子来说吧,我们通过辛辛苦苦地码程序攒了点积蓄,想着拿这一笔钱来做点理财,理财的话炒股是利润比较高的,但是我们又没有理财经验,该怎么做才好呢?

为了方便,我们不如到银行找一个理财经理,我们只需要把钱交给他,让他来帮我们打理就可以了。

测试代码如下,首先有一个理财的接口

JAVA设计模式1——代理模式

然后有一个炒股类实现理财接口,这里炒股的方法中,有炒股经验的对象才能炒,没有的不可以。


JAVA设计模式1——代理模式

再创建一个理财经理类,实现理财接口,默认理财经理有炒股经验

JAVA设计模式1——代理模式


最后,我们去执行理财方法吧,这里在最下面,我们试一下直接访问炒股类

JAVA设计模式1——代理模式

运行程序,得出如下

JAVA设计模式1——代理模式

最后的测试代码的类图如下所示,其中理财(ManagerMoney)就是目标(Subject);炒股(TradeStock)就是理财的实现类,理财经理(FinancialManager)就是代理,去理财的方法通过代理,更方便地实现了理财。

JAVA设计模式1——代理模式

(截图使用的IDEA中的PlantUML插件,感兴趣的可以自行搜索,或者有问题的可以留言交流)

到这里一个简单的例子就完成,相信大家也都有了一个初步的认识,下一篇会学习一下JDK动态代理的知识。


喜欢文章或想一起学习的朋友可以关注我,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步。在收藏的同时能给我点个赞,感激不尽。

JAVA设计模式1——代理模式