程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Groovy >> Groovy探索之MOP 十六 使用Interceptor實現簡單的觀察家模式

Groovy探索之MOP 十六 使用Interceptor實現簡單的觀察家模式

編輯:Groovy

觀察家模式是我們比較常用的一種模式,也是其他的一些常用模式的基礎,比如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
}

}

這個實現我就不多說,它首先繼承了Bee類,然後實現了Interceptor接口,就是一個簡單的攔截器實現。在“afterInvoke”方法裡判斷一下是否是“open”方法,代表的是花開動作,如果是的話,就通知Bee類,該采花了,即調用了Bee類對象的“eat”方法。

最後,我們來使用這個攔截器來實現觀察家模式:

def proxy= ProxyMetaClass.getInstance( Flower )

def bee = new BeeObserver()

proxy.interceptor= bee

proxy.use{

def flower = new Flower()

flower.open()
}

這種實現也十分的簡單,跟普通的攔截器的使用一模一樣,在這裡,我們就不多說了。上面代碼的運行結果為:

the flower is opening...
it is bee's meal time...

果然是十分輕松的實現了我們的觀察家模式。

由於我們的Flower類十分的干淨,沒有任何的因為要實現觀察家模式所強加的代碼,因此,它可以再繼承任何的父類。對於我們的觀察者——Bee類,也是同樣的道理。

關於這一點,在這裡只是點到為止,不再多說,因為都十分的簡單。

倒是對於我們的觀察者,則可以有進一步的簡化的可能,因為我們的觀察者只需要實現“afterInvoke”方法,其他的Interceptor接口的兩個方法則不必管它。

所以,我們可以進一步抽象一下觀察者:

abstract public class BaseObserver 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
return true
}

abstract public boolean doInvoke();

}

現在,我們的觀察者,則只需要繼承“BaseObserver”類即可。當然了,如果我們的觀察者類需要繼承其他的父類,則無需做此抽象。一切憑你的現實需要。

以上,我們就使用Interceptor來實現了一個簡單的觀察家模式。當然了,觀察家模式還有比上面所講到的更為復雜的,這就是我們另外一個主題所要談到的內容,在這裡就不多說了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved