多少听众是太多的观察者模式

How many listeners are too many observer pattern?

本文关键字:观察者模式 太多 多少      更新时间:2023-10-16

我的类已经继承了两个侦听器。我需要再添加一个侦听器。它变成了下面这样:

class DatabaseManager : public DatabaseChangeListener, 
                        public PropertyChangeListener,
                        public RenumberListener

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

这里气味

的主要标志是你的类被称为DatabaseManager(听起来像一个神对象),以及接口对它们的特殊音调(例如RenumberListener)。

支持多个事件钩子本身并没有错,多重继承本身也没有错。您可能只需要将一些接口分组到一个清晰的接口中,该接口描述您的类做什么、它存在的基本权利、谁使用它以及用于什么目的。

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

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

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

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

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

不要使用继承。实现一个侦听器接口并使用 onEvent 方法处理它将事件传递给不同的处理程序。在不同的事件类型上订阅您的对象。这样,您可以轻松地更改任何事件和处理程序,而无需更改数据库管理器。即使是新事件也不需要数据库管理器提供太多。

考虑使用类似责任链的东西来使您的经理类完全不依赖于事件类型。它可以只使用一串 IHandler 对象,这些对象可以注入到构造函数中。