Java代理之设计模式
1 概述
代理模式(Proxy Pattern)是结构型设计模式中的一种,它通常为其他对象提供一种代理机制以增强和控制对该对象的访问,但不改变原来的对象本身的结构。代理一般可以作为与对象交互的接口,这些对象包括:网络连接对象、远程对象、创建一次需要很大开销的对象、需要保护的对象、内存中的大对象、需要附加线程安全的对象、需要在原来的功能上附加或扩展的对象等等。
2 实现途径
Java编程语言有其自身的特点,在Java语言中,实现设计模式的途径主要有两种:通过实现接口的方式和通过继承超类的方式。
2.1 实现接口的方式
实现接口方式的代理如下图所示:
图 1 实现接口的方式
在这种方式中,代理类ProxySubject和被代理的类RealSubject都实现(implements)了相同的接口ISubject,但是代理类和被代理类之间存在关联。其他的协作者Collaborator实际上和ProxySubject交互,不管是出于自身的利益还是被代理对象的利益,ProxySubject在RealSubject行为的执行之前和之后都可以加入自己的特定的行为。ProxySubject的示例代码如下:
2.2 继承超类的方式
继承超类方式的代理如下图所示:
图2 继承超类的方式
在这种方式中,代理类ProxySubject和被代理的类RealSubject是继承关系(extends),是子类和父类的关系。其他的协作者Collaborator实际上和ProxySubject交互。ProxySubject根据面向对象语言的多态性,利用覆写(overwrite)机制,在父类RealSubject行为的执行之前和之后都可以加入自己的特定的行为。ProxySubject的示例代码如下:
3 比较分析
在被代理的对象的类有接口的情况下,可以使用实现接口的方式,也可以采用继承超类的方式。在被代理的类没有接口的情况下,只能使用继承超类的方式。在继承超类的方式下,但是如果超类中定义有final的方法 ,该方法是无法被代理的;如果该类是final的类,则该类是无法被代理的。
在上述无法代理的情况下,可以考虑使用委托模式,代理类定义和被代理的类一样的方法,并且和被代理类关联,也可以实现代理,但是失去了面向对象的继承性和多态性。