2007/7/23

Chain of Responsibility Implementation using Spring IoC

GoF中提到,Chain of Responsibility的實作方式有兩種,一種是製作successor串列(利用Composite的既有父節點指標,或是自己再另外寫一個,這個實作可以寫在Handler裡面或是定義在這些Event Handlers的外面),一種是直接連接successor。

Spring IoC提供使用者以XML定義的方式,初始化物件,假設我們先定義了一個Event Handler interface,接著先依照自己的需要實作多個物件,implements這個Handeler介面,而以Spring XML設定的方式,初始化多個物件實體。

再來就是靠Spring在ApplicationContext中提供的getBeansOfType這個method,一次將所有定義在xml裡面,實作了EventHandler介面的所有beans,然後依序將Event傳送給所有Event Handler處理。當然這種實作方式,沒有辦法彈性地設定這些EventHandler接收Event的前後順序,只能保證Event確實會傳送給每一個在XML中已經定義的EventHandlers。

如果要讓EventHandler自己決定下一個EventHandler是誰,開發人員可以調整XML定義bean的順序,讓getBeansOfType取到bean的順序,就是xml中定義的順序,但這不是一種彈性的作法。另一種作法,得在EventHandler中增加一個method,傳回下一個EventHandler的bean id,但這樣寫似乎也不是一種好方法。

Anyway我們的issue並不在意處理Event的順序,所以...就先這樣吧。