2009-06-30 94 views
0

我对标准监听器很熟悉,在Java中。例如,如果您有一个对象集合,它可能支持一组侦听器来处理不同的事情: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++来说,实现多个接口很困难。

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

有了这个说明,超集抽象类比单个抽象类更有意义吗?

回答

1

只有当它们在语义上相似(内聚力),并且如果很可能感兴趣事件“objectsCreatedA”的对象也对“objectsCreatedB”感兴趣,我才会将这些函数组合到一个接口中,否则您将结束有些功能未实现的类:非常难看。作为替代方案,如果事件真的如此相似,则可以传递“type”参数,因此接收者可以分解出一些代码并选择要处理的事件类型。

+0

传递一个类型 - 但可能一次处理的对象集合是类型的组合(一些更改,一些创建) - 您是否会多次调用该方法,每个都有不同的类型,或者您需要传递每个对象的类型? – 2009-06-30 19:27:32

+0

该逻辑将与调用listener.objectsCreatedA(aBounchOfObjects)相同; listener.objectsCreatedB(anotherBounchOfObjects); : listener.objectsCreated(Type.A,aBounchOfObjects); listener.objectsCreated(Type.B,anotherBounchOfObjects); – akappa 2009-06-30 19:32:13

0

我看到将所有这些分组到一个类中的唯一缺点是该类可能最终变得相当大且难以阅读。话虽如此,如果听众并不完全相似,那么最终可能会形成一个庞大的类,其中包含大量随机功能,这些功能会具有相当高的耦合度。

如果你最终走这条路线,确保这个侦听器只存在一次(单例,静态,无论)。

1

由于类可以实现多个接口,我没有看到除了声明一个类实现了一系列不同的侦听器之外,它不会节省任何东西。另一方面,它可能迫使课程实施他们实际上不需要实施的方法。