Pushlet 开源框架中观察者模式分析

Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模型:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 https://github.com/wjw465150/Pushlet

一:观察者模式定义

观察者模式:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

这个定义也不抽象,所谓的定义对象之间的一对多依赖这个很好理解,就是说一个被观察者对应于多个观察者,然后被观察者的状态发现改变,那么就会通知订阅了这个状态变化的观察者。现在先来看下UML类图:

角色介绍:

  • Observable:被观察者的接口,定义了一些被观察者需要的方法,比如addObserver添加观察者,deleteObserver删除观察者,notifyObservers通知所有的观察者状态变了。
  • Observer:观察者接口,定义了一些观察者需要的方法,比如update更新观察者。
  • ConcreteObservable:被观察者,实现了Observable接口,具体实现了Observable接口里面的方法,而且里面有观察者的集合,在通知的时候可以通知到所有的观察者。
  • ConcreteObserver:观察者,实现了Observer接口,具体实现了update更新方法,同时在适当的时机会将观察者添加到被观察者的集合里面。

 

二:Pushlet 开源框架中观察者模式解析

在Pushlet框架中,我们要将用服务器端为每个客户端分配一个会话 ID 作为标记, 然后事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。这样就可以实现多节点集群。要实现上述要求,运用观察者模式无疑是非常适合的选择。我们将服务器端看做消息的发布者,每创建一个id,就是创建了一个观察者,每当事件源产生新的事件,那么就更新所有的观察者。

https://github.com/wjw465150/Pushlet/blob/branch-redis/src/nl/justobjects/pushlet/client/PushletClientListener.java

三:观察者模式给该项目带来的好处

1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

  2.观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。

 

posted @ 2018-10-22 11:02  茶水微凉  阅读(292)  评论(0编辑  收藏  举报