我对标准监听器很熟悉,在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++来说,实现多个接口很困难。
超集抽象侦听器可以为每个方法提供默认的无操作实现,因此,扩展它的客户端只需要覆盖他们关心的那个。通过这种方法,我们以后可以决定向抽象类添加额外的方法,并且现有的客户端可以正常工作(并且可以/如果他们选择,可以重写这些新方法)。一次调用只需要一次注册,而不是许多注册方法的替代方法(应用程序调用一个或多个注册方法)。
有了这个说明,超集抽象类比单个抽象类更有意义吗?
传递一个类型 - 但可能一次处理的对象集合是类型的组合(一些更改,一些创建) - 您是否会多次调用该方法,每个都有不同的类型,或者您需要传递每个对象的类型? – 2009-06-30 19:27:32
该逻辑将与调用listener.objectsCreatedA(aBounchOfObjects)相同; listener.objectsCreatedB(anotherBounchOfObjects); : listener.objectsCreated(Type.A,aBounchOfObjects); listener.objectsCreated(Type.B,anotherBounchOfObjects); – akappa 2009-06-30 19:32:13