2009-04-27 66 views
2

我有三個類以一種有趣的方式進行交互。一個是模型類,它必須被其他兩個類訪問,所以它的一個實例保持爲每個類的成員。這兩個類都以不同的方式與模型進行交互。兩個對象之間共享的模型

有幾個實例需要將模型對象完全拋棄並替換爲新實例,這使事情變得複雜。這兩個場合都出現在觀看/控制類中。因此,這些類中的任何一個都必須能夠向另一個發送信號,說:「我們需要協調並促進用一個新的Model對象替換我們的Model對象。」現在我在B類中有代碼告訴A類構造一個新的Model並將其發回,但是現在我需要處理相反的情況,事件在A類中出現,不幸的是A類沒有引用B類,可能不應該。

什麼是處理這個問題的好方法?

更新:抱歉,夥計們,這不能是一個單身人士。單身是當你需要保證只有一件事。這與我上面提出的任何要求沒有任何關係。這個班不是一個單身人士,不應該是。

更新:直到現在,實際上這個Model類實際上只有一個實例,但我有一個模糊的懷疑,我需要更多的,並且我不想通過使用Singleton來限制自己設計模式,這實際上解決了我所擁有的不同顧慮。原來我是對的:昨天我收到一個新的要求,現在我需要支持任意數量的這些。 :)當你不需要時,不要限制自己,也不要在設計模式不適用的情況下濫用設計模式!

回答

5

您需要一箇中間模型圖層,即兩個類中每一個都引用的模型「持有者」對象。 ModelHolder擁有對模型的引用。

此ModelHolder還應該支持偵聽器,所以當它的模型被拋出時,它可以通知任何偵聽器模型已經改變。

+0

我完全同意。持有人是模型的所有者。它管理模型的生命週期,包括爲客戶提供服務請求以請求將模型換出新模型。客戶可以註冊一個監聽器來通知更改(例如新模型)。 – 2009-04-27 20:22:11

+0

我想我正在修改這個版本。從某種意義上說,ClassA實際上就是ModelHolder,所以我只實現了一個監聽器接口,ClassB將實現這個監聽器接口,以便在應該接收到新的Model對象時通知它。 – skiphoppy 2009-04-27 20:22:26

1

好吧,如果你需要改變模型(而不是強迫),可以使聽者接口,使兩個對象A和B實現它:

public interface ModelListener { 

    public void modelChanged(Model newModel); 
} 

,並在適當的時候,你可以通知新模型的聽衆會改變。您也可以擁有一個包含所有註冊偵聽器的列表。

List<ModelListener> modelListeners = new ArrayList<ModelListener>(); 

    public void setNewModel(Model m) { 
     for (ModelListener aListener : m.modelListeners) 
      aListener.modelChanged(m); 
    } 

一如既往,在簡單性和健壯性之間進行權衡。您可能想要嘗試自己的案例所需的關卡。

0

我經常在GUI項目中遇到這個設計問題(Swing,GWT)。我通常所做的是創建一個更高級別的「狀態」模型,該模型包含2個或更多類共享的對象實例。狀態然後有一個ModelListener接口,其他類可以實現該接口以獲取對基礎模型的更改通知。 State.setFoo()然後將ModelChanged事件發送給監聽器,監聽器響應相應的響應。

相關問題