为多种类型实现观察者模式的最佳方法是什么?

时间:2009-03-29 00:12:25

标签: design-patterns

我有一个代理人可以监控某些情况。对于每种情况,我想通知另一位观察者,因为这种情况的责任在于观察者。

根据维基百科,在C ++中为单个观察者/主题做这件事的方法是创建一个虚拟类(类似于Java接口),它定义了Observer的更新方法,并定义了注册方法。主题。然后每个具体类继承其各自的接口。

但是,我可以设想这种情况发生在任意数量的条件下,每个条件都需要另一个接口和每个新条件的具体观察者类。那种设计有意义吗?并且为每个新条件添加观察者界面听起来是否合理?

1 个答案:

答案 0 :(得分:3)

如果你把它与锄头Java处理GUI组件上的事件(不完全相同,但是相同的一般想法)进行比较,你会得到类似的东西:

public void addActionListener(ActionListener listener) { }
public void addWindowListener(WindowListener listener) { }
public void addComponentListener(ComponentListener listener) {}
public void addMouseListener(MouseListner listener) {}

所有* Listener都是接口。然后,您提供一个或多个实现接口的类(我更喜欢每个侦听器类型一个类,其他人更喜欢创建一个实现所有侦听器的类)。

这证明非常灵活,因为事情只能注册他们感兴趣的事件。

另一种选择是单个“addListener(监听器监听器)”方法,其中监听器接口中包含每个可能的事件,这将是一个坏主意,除非您可以通知他们不关心的事件。

那么,您是否期望对您可以倾听的内容进行细致的控制?如果是这样,Java模型运行良好(如果您不关心它,则工作正常,它非常灵活)。如果您认为所有事件都需要通知所有事件,那么单一的“主”方式也会起作用。

听起来你想要细粒度的控制,所以我可以为每个常规类别的事件做一个接口的Java事件方式。