以观察者模式过滤广播

时间:2011-06-08 23:59:44

标签: oop design-patterns

主题发生变化时,高级程序员想要使用我的观察者模式类来更新不同的对象。现在主题将通过接收具有不同语义的消息而改变。假设有两种类型的消息,mA和mB,我有三个观察者oX,oY和oZ。

  • oX想知道mA
  • oY想了解mB
  • oZ想知道mA和mB

他告诉我在主题方面有一些逻辑(if-else)说

  • 如果mA到达,则将其发送到oX和oZ
  • 如果mB到达,请将其发送至oY和oZ

对我来说,这感觉很可疑,因为它使主体了解其观察者的具体类型(我正在使用抽象类向观察者广播)

感觉更像是路由器知道目的地,而不是广播给听众有趣的人。由于我是一名初级程序员,所以我没有反对,但感觉就像打破了这种模式。

3 个答案:

答案 0 :(得分:1)

你是对的。这种知识必须在某种调度员身上。这可能包括超级简单,在这种情况下它基本上是一个Mediator,更复杂的东西,在这种情况下,你想要下载Doug Schmidt书籍并查看他的一些解决方案(例如Reactor或Proactor)。 / p>

另一种选择是支持不同的听众。例如,我可以有一个向导的生命周期监听器,在这种情况下,我将触发onStart(),onNext()和onFinish()。然后没有逻辑,另一方只关注它感兴趣的事情,或者根据远程事件状态触发它的行为。

您可以使用Command始终将Observer内部翻出来。如果有人对你说'嘿,当x发生时,如果y为真,那么执行z,'你可以有一个命令,如果y在内部执行z并且你只是在x发生时触发它(通过调用execute() )。

答案 1 :(得分:1)

在不了解更多细节的情况下,我倾向于同意你的观点。特别是如果组件都在相同的内存空间中,只需广播消息并让观察​​者理清他们所在的内容。但是特定问题可能比你意识到的要多。试着理解他为什么这么想。在一个项目上经常会隐藏一些历史记录,从而推动看似奇怪的决定。

答案 2 :(得分:0)

您可以修改主题用于通知观察者的notify()方法的签名。您可以将所有事件类型放在枚举中,然后将其用作notif(EventType类型)的参数,然后在每个观察者中,您可以编写一个简单的if starement并进行过滤。

假设ObserveTemp和ObserveHumidity是主题室的两个观察者,那么如果温度变化你可以做 observer.notify(Event_Temp),如果湿度变化,你可以做通知(Event_Humidity)。在Observers中,当您为notify方法提供实现时,您可以修改notify()方法的签名,该方法由subject通知观察者。您可以将所有事件类型放在枚举中,然后将其用作notif(EventType类型)的参数,然后在每个观察者中,您可以编写一个简单的if starement并进行过滤。

假设ObserveTemp和ObserveHumidity是主题室的两个观察者,那么如果温度变化你可以做 observer.notify(Event_Temp),如果湿度变化,你可以做通知(Event_Humidity)。在ObserveTemp中,当您为notify方法提供实现时,您可以执行以下操作。

public void notify (Event_Type type)    {
    if (type == Event_temp){
        //do processing...
    }
}

希望它有所帮助,这里的主题不需要知道哪些概念类是按照惯例实施观察者。