0

我熟悉标准听众,尤其是。在爪哇。例如,如果您有一个对象集合,它可能支持一组不同事物的侦听器:CreateListener、ChangeListener、DeleteListener。每个都有一个方法(例如 objectChange),它被传递一个受影响对象的列表。使用此集合的应用程序可以通过实现和注册侦听器来注册对其中一个或多个的兴趣。当集合中的对象发生事情时,将调用适当的侦听器。

但是,如果有许多这样的事件类型,可能相似但有些不同。而是定义一个具有许多方法的侦听器类是否有意义。例如:

class EventListener
{
    void objectsCreatedA( Object[] newObjects );
    void objectsCreatedB( Object[] newObjects );
    void objectsCreatedC( Object[] newObjects );

    void objectsChangedA( Object[] newObjects );
    void objectsChangedB( Object[] newObjects );
    void objectsChangedC( Object[] newObjects );

    void objectsDeletedA( Object[] newObjects );
    void objectsDeletedB( Object[] newObjects );
    void objectsDeletedC( Object[] newObjects );
}

对于想要注册其中许多事件的应用程序来说,这似乎更容易——它们在一个类中实现了许多方法,而不是定义许多类,每个类只实现一个方法。有什么缺点或其他建议吗?

澄清编辑:(对不起,我对假期分心了,不确定这是否应该是一个单独的帖子,但似乎有必要跟进这个帖子)

我应该指定此代码将以多种语言实现,作为客户端应用程序将使用的框架。对于 C++,实现多个接口很困难。

超集抽象侦听器可以为每个方法提供默认的无操作实现,因此扩展它的客户端只需覆盖他们关心的那些。使用这种方法,我们稍后可以决定向抽象类添加额外的方法,并且现有的客户端就可以了(并且可以在他们选择时覆盖这些新方法)。一次调用只需要一次注册,而不是许多注册方法的替代方案(应用程序调用一个或多个)。

有了这个澄清,超集抽象类是否比单个抽象类更有意义?

4

3 回答 3

1

只有当它们在语义上相似(内聚)并且很可能对事件“objectsCreatedA”感兴趣的对象也对“objectsCreatedB”感兴趣时,我才会将这些函数分组到一个接口中,否则你将以一些类结束未实现的功能:非常丑陋。

作为替代方案,如果事件真的非常相似,您可以传递一个“类型”参数,以便接收者可以分解出一些代码并选择要处理的事件类型。

于 2009-06-30T18:41:59.253 回答
1

由于类可以实现多个接口,除了声明一个类实现一系列不同的侦听器之外,我认为这不会为您节省任何事情。另一方面,它可能会强制类实现它们实际上不需要实现的方法。

于 2009-06-30T19:01:48.483 回答
0

我认为将所有这些分组到一个类中的唯一缺点是该类最终可能会变得相当大且难以阅读。话虽如此,如果侦听器根本不相似,您最终可能会得到一个庞大的类,其中包含一堆随机功能,具有很高的耦合度。

如果您最终选择了这条路线,请确保该侦听器仅存在一次(单例、静态等)。

于 2009-06-30T18:45:36.267 回答