2009-06-30 90 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

由於類可以實現多個接口,我沒有看到除了聲明一個類實現了一系列不同的偵聽器之外,它不會節省任何東西。另一方面,它可能迫使課程實施他們實際上不需要實施的方法。