首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有两个观察者列表的观察者模式

带有两个观察者列表的观察者模式
EN

Stack Overflow用户
提问于 2011-06-29 20:33:10
回答 4查看 4.1K关注 0票数 4

我有一个MyObserver类,用于侦听通告程序中的更改。Notifier扩展了Observable并用notifyObservers(Object)通知它的事件。作为参数传递的对象始终是同一类的实例。问题是每个观察者需要监听不同的事件。例如,一个观察者需要监听状态改变的事件,而其他观察者需要监听所有类型的事件。我如何使用观察者模式来做到这一点呢?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-29 20:46:41

如果您可以稍微更改一下设计:

代码语言:javascript
运行
复制
interface MyObserver {
    public void stateChangeEvent();
    public void otherEvent();
}

class MyObserverAdapter implements MyObserver {
    public void stateChangeEvent() {
         // some default implementation or no implementation.
    }

    public void otherEvent() {
         // some default implementation or no implementation.
    }
}

class MyStateChangeObserver extends MyObserverAdapter {
    public void stateChangeEvent() {
         // implement behavior specific to this class.
    }
}

class MyOtherObserver extends MyObserverAdapter {
    public void otherEvent() {
         // implement behavior specific to this class.
    }
}

用法:

代码语言:javascript
运行
复制
MyObserver stateObserver = new MyStateChangeObserver();
MyObserver otherObserver = new MyOtherObserver();
notifier.notifyObservers(stateObserver);
notifier.notifyObservers(otherObserver);
票数 3
EN

Stack Overflow用户

发布于 2011-06-29 20:40:32

使用notifyObservers(Object arg)版本并创建某种“事件类型”对象来固定在其中。在观察类中,只需对传入的事件类进行过滤即可。

代码语言:javascript
运行
复制
public void update(Object observable, Object arg) {
    if ( (MyEvent) arg.isEventX() ) { /* do stuff */ }
}
票数 5
EN

Stack Overflow用户

发布于 2011-06-29 21:15:09

我认为观察者模式的Java内置实现不适合您的情况。

事实上,当只有一种可观察到的事件发生时,一般的观察者模式是可用的。在观察者设计模式中,总是通知所有观察者。

因此,在这种情况下,您需要通过定义您自己的可观察接口来扩展通用的观察者模式,例如,如下所示:

代码语言:javascript
运行
复制
public enum EventKind {
   EVENT_A, EVENT_B, EVENT_C;
}

public interface Observable {
   public void registerObserver(EventKind eventKind);
   public void unregisterObserver(EventKind eventKind);
   public void notifyObservers(EventKind eventKind);
}

然后,您可以只实现这个Observable接口,并为每种要通知的事件提供内部列表。如果愿意,您仍然可以使用Java内置的观察者接口。

这种方法有以下优点:

在不影响Observers.

  • You代码的情况下,
  1. 你可以灵活地添加更多种类的事件,可以注册任何观察者到任何事件。
  2. 你只更新对每个事件感兴趣的观察者。
  3. 你避免了观察者端的“空方法”,“事件类型检查”和其他技巧。

<>G222>

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6520673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档