准确的将事件或消息发送给观察者,避免迭代带来的性能开销。
1)OringinalObservable
事件源
2)AccurateDispatcher
该类能够将事件或消息准确的发送到关心者。通过 Hash 或其它方式寻找关心者,而不是通过迭工的 方式查找。
3)ConcreteObserver
事件或消息的关心者。
2) The observer composite
1)OringinalObservable
事件源
2)AccurateDispatcher
该类能够将事件或消息准确的发送到关心者。通过 Hash 或其它方式寻找关心者,而不是通过迭工的 方式查找。
3)ConcreteObserver
事件或消息的关心者。
java 代码
- public class AccurateDispatcher implements IListener {
- protected void dispatchAccurately(Event event) {
- IListener handler = getEventHandler(event);
- handler.doSomething(event);
- }
- public void addEventListener(IListener l) {
- //Add the listener
- }
- public void removeEventListener(IListener l) {
- //Remove the listener
- }
- protected IListener getEventHandler(Event event) {
- // Find the handler with hash arithmetic and the parameters in the
- // event.
- return null;
- }
- public void doSomething(Event event) {
- dispatchAccurately(event);
- }
- }
模式应用<o:p></o:p>
<o:p> </o:p>
在EMS/OMC中都会有告警(它是网管系统中的概念),在前端(在C/S构架中的客户端)告警的观察者会很多,少则几千,多则几万都有可能,所以如果当一条告警产生时,并且该告警只有一个或几个观察者(多个观察者可以使用Observer Composite模式),如果通过迭代的方式进行传播,性能会很差,如果使用Accurate event dispatcher 则可以大大的减少性能开销。
当然,使用该模式的前提是:1)消息的观察者可以通过消息中的属性能够定位;2)消息的观察者不是所有已经注册的观察者。
<o:p> </o:p>
模式的延伸<o:p></o:p>
1) The second event dispatcher
在 JMS 应用开发时,如果注册太多 JMS 的 Listener 可能会使用一条消息,这样我们可以通过二级事件派发者,进行再次转发。二级事件派发者,可以按照事件的业务类型进行分类,这样可以在二级事件派发者对事件派发的性能进行优化或者容错处理。也可以提高 JMS 事件的派发性能。2) The observer composite
该模式Second Event Dispatcher的一种特殊应用。
参考<o:p></o:p>
1) Event Aggregator (http://martinfowler.com/eaaDev/EventAggregator.html)