今天抽了点时间学习了下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.");
}
}
一个事件源对要添加多个监听器,非常的简单,方便。
学习消息总线的体会!
最新推荐文章于 2024-08-21 17:47:38 发布