2013-03-05 28 views
0

我有觀察者設計模式,通過靜態方法完成附加/分離所需的觀察者。我謹慎地使用了靜態方法,因爲每個節點的觀察者列表在內存方面會花費很多。請讓我知道,如果我從設計的角度來看是錯誤的(使用靜態方法和變量是否正確?)。設計和通用列表清理

public static void Attach(FormComponentObserverBase observer) 
    { 
     observers.Add(observer); 
    } 

    public static void Detach(FormComponentObserverBase observer) 
    { 
     observers.Remove(observer); 
    } 

    public static void DetachAll() 
    { 
     if (observers == null) 
     { 
      return; 
     } 

     foreach (var o in observers) 
     { 
      Detach(o); 
     } 
    } 

    public static void Notify(MyObservedObject c) 
    { 
     if (observers == null) 
     { 
      return; 
     } 

     foreach (var o in observers) 
     { 
      o.Update(c); 
     } 
} 

觀察者正在觀察樹對象結構。由於樹在記憶方面昂貴,我想確保我不會在記憶中留下任何額外的東西。我試圖實現IDisposable接口,並通過Dispose方法,我想清理觀察者和其他不必要的實例相關對象。就觀察員通用清單而言,以下內容足以使觀察員清單符合垃圾回收的條件嗎?

DetachAll(); 
observers = null; 
+1

這裏_gain_有靜態方法嗎?他們會殺死可測試性,而且你會在你的類的所有實例之間共享觀察者(所以他們會得到他們沒有註冊的對象的通知)。在一個實例方法中放置STATIC(然後是SHARED)對象是否正確?這是你想要的嗎?只要放下靜態和生活快樂...... – 2013-03-05 16:18:55

+0

我們無法確定數據類型觀察者是什麼,或者班上還有什麼?我們只看到靜態方法。 「我有觀察者設計模式」並沒有真正告訴我們多少。 – 2013-03-05 16:19:43

+0

事情是,如果我保持觀察者作爲實例變量,我可能會得到樹節點的觀察者的許多副本。使用靜態,我試圖避免這麼多觀察者列表的副本。 Dispose方法只會在根樹節點上調用。這是正確的方法嗎? – 2013-03-05 16:23:06

回答

0

假設Remove實際上從列表中刪除觀察者,那麼沒有什麼別的你需要儘可能這個數據結構有關的事情。沒有特別的理由設置observers = null。這只是釋放了用於觀察者列表的少量內存,並且使代碼複雜化,因爲您必須隨處檢查null。例如,如果您DetachAllobservers = null,那麼你Attach必須是:

if (observers == null) 
{ 
    // create observers list 
} 
observers.Add(observer); 

我不會建議,呼籲在Detach方法觀察者Dispose,因爲觀察者可能仍然是一個活躍的對象。

你可能不希望這是靜態的。從靈活性和可測試性的角度來看,您最好使用實例對象。如果您確實需要確保您的程序無法創建多個實例,則可以實現單例設計模式,但這可能不是必需的。

+0

感謝單身人士的建議。注意是有用的。 – 2013-03-05 16:56:35