今天抽了點時間學習了下OperaMasks的消息總線,感覺它這個總體的設計思路還是非常棒,值得我們學習。
讓我體會最深得一點就是解耦,用裏面的比喻,就是演講者(事件源)與聽衆(事件監聽者)的解耦。
以前我在做基於構件的編程的時候,經常碰到的一個問題:一個事件源,而多個監聽者要求去監聽的時候,都必須把這個事件源的句柄給給引入進來。這就造成了代碼的耦合度不好,而且不利於擴展。舉例如下:
一個按鈕 <mx:Button id='button' label='Helloworld!' width='100'/>
如果我有好幾個監聽器要對此button進行監聽,那麼我們要做的就是在每個監聽器上給加上這個button的句柄:
button.addEventListener(MouseEvent.CLICK,eventhandle(event));
如果你是用pureMVC,更能體會到這點的不便之處。
OperaMasks的消息總線針對這一點進行了改進,它將事件源與監聽者完全分開,即:事件源只管發事件,誰愛監聽誰監聽。不再需要句柄,完全解耦。舉例如下:
頁面:
<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:w="http://www.apusic.com/jsf/widget" xmlns:layout="http://www.apusic.com/jsf/layout"
renderKitId="AJAX">
<w:page title="apply fee">
<w:form>
<layout:panelGrid columns="2">
<w:textField id="money"></w:textField>
<w:button id="apply" />
</layout:panelGrid>
</w:form>
</w:page>
</f:view>
事件源:
@ManagedBean(name="projectManagerBean", scope=ManagedBeanScope.SESSION)
public class ProjectManagerBean {
@EventListener("applyFee")
private void applyFeeListener(int money) {
System.out.println("I'm your project manager, you apply " + money + " money.");
}
}
事件監聽者:
@ManagedBean(name="projectManagerBean", scope=ManagedBeanScope.SESSION)
public class ProjectManagerBean {
@EventListener("applyFee")
private void applyFeeListener(int money) {
System.out.println("I'm your project manager, you apply " + money + " money.");
}
}
一個事件源對要添加多個監聽器,非常的簡單,方便。
學習消息總線的體會!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.