有多少听众观察者模式太多了?

时间:2016-02-04 13:29:53

标签: c++ design-patterns

我的班级已经从两个听众继承了。我需要再添加一个监听器。它变成了如下所示:

class DatabaseManager : public DatabaseChangeListener, 
                        public PropertyChangeListener,
                        public RenumberListener

我应该避免过多的观察者吗?即使监听器是抽象类,但是我使用多重继承会让我感到困扰。我很好奇有没有人经历过这样的事情;因为太多的观察者代码变得复杂和错误?

3 个答案:

答案 0 :(得分:3)

这里有嗅觉的主要迹象是你的班级被称为DatabaseManager(听起来像一个神对象),以及界面对它们的专门音调(例如RenumberListener

支持多个事件挂钩,以及本身的多重继承,没有任何内在错误。您可能只需要将一些接口组合成一个明确的接口,该接口描述您的类做什么,它存在的基本权利,使用它的人以及用途。

另请注意,实现接口是一种针对类的使用者的功能。如果不需要通用接口,最好不要使用它们,否则你可能会发现自己在一个极端的系统中有每个成员函数的接口,而在另一个极端没有明确的指导什么是界面,什么不是。

答案 1 :(得分:1)

如果您想减少类的数量,可以尝试通过创建基本的侦听器接口来抽象出您收听的不同类型的消息,例如

virtual void onEvent(Subject * subject, Message * message) = 0;

然后您为不同类型的事件注册您的DatabaseManager?这样您仍然可以使用单继承。我知道像Qt等系统使用它来调度事件。

但据我所知,如果你的基类(DatabaseChangeListener,PropertyChangeListener和RenumberListener)是纯抽象的,你就不会遇到多重继承的问题。

答案 2 :(得分:0)

不要使用继承。实现一个侦听器接口并使用onEvent方法来处理它将事件传递给不同的处理程序。在不同的事件类型上订阅您的对象。这样,您可以轻松更改任何事件和处理程序,而无需更改DatabaseManager。甚至新事件也不需要来自DatabaseManager。

考虑使用责任链这样的内容,使您的经理类完全不受事件类型的影响。它可以只使用一系列IHandler对象,可以在构造函数

中注入