观察家模式是我们比较常用的一种模式,也是其他的一些常用模式的基础,比如MVC模式就是一种以观察家模式为基础的模式。
在Java语言中,观察家模式的实现十分的简单,就是让被观察者继承Observable类,而让观察者实现Observer接口。这些基础的用法,都在我的文字——《螳螂捕蝉、黄雀在后——从一个成语谈观察家模式》中有所谈到,在这里不再细述。
如果我们在实际的编码中有使用过观察家模式,就有可能会发现我们在Java语言中实现的观察家模式的弱点:就是,如果我们的被观察者想继承一个类的话,就会发现没有办法再继承了,因为作为一个观察者,它必须继承Observable类,而Java语言是不允许多继承的。所以这就构成了我们的观察家模式的一个最大的弱点。
在Groovy语言,我们当然也可以使用上述的方法来实现观察家模式,这种实现方式的弱点当然也被继承下来了。
在需要再次提醒的是,我们的Groovy语言拥有强大的MOP特性,有了它,我们就有可能突破我们在Java语言中所遇到的一些障碍。本篇就是要来探讨如何使用Interceptor来实现观察家模式,以及这种实现是如何突破我们前面所谈的的Java语言所实现的观察家模式的弱点的。
其实实现观察家模式的思路十分的简单:就是被观察者在做某个动作的时候,要通知一下观察者,我做了这个动作,从而使得观察者做相应的动作。这个思路的关键就在于观察者在做完某个动作后,要通知观察者。我们在学过Groovy语言的拦截器以后,就可以知道,这种通知,其实就可以使用拦截器来做。
这就是我们使用拦截器来实现观察家模式的一个简单的思路。下面以一个例子来详细说明是如何实现这个思路的。
这个例子说的是蜜蜂采花粉的事,对应于观察家模式,就是花朵在开花的时候,通知一下蜜蜂,蜜蜂就可以来采粉了。下面就是这个例子的实现。
首先是花朵类:
public class Flower{
def open()
{
println 'the flower is opening...'
}
}
在我们的实现里,Flower类的实现十分的简单,它就只管开花就行,不需要再做其他的任何事情,比如在Java语言对于观察家模式的实现中,它就需要继承Observable类,然后开完花以后,还有通知观察者——蜜蜂类。
接着来看我们的蜜蜂类:
public class Bee{
def eat()
{
println "it is bee's meal time..."
}
}
它的实现也十分的简单,只需要实现采花的动作,其他的不用管。而在我们的Java语言的观察家模式的实现中,我们的Bee类则需要实现Observer接口。
既然是使用Interceptor来实现观察家模式,那么,我们还是要实现Interceptor接口的,不然,我们怎么使用拦截器呢?
public class BeeObserver extends Bee implements Interceptor{
public Object beforeInvoke(Object object, String methodName, Object[] arguments){
// TODO Auto-generated method stub
return null
}
public Object afterInvoke(Object object, String methodName, Object[] arguments, Object result){
// TODO Auto-generated method stub
if(methodName=='open')
{
this.eat()
}
return result
}
public boolean doInvoke(){
// TODO Auto-generated method stub
return true
}
}