2013-03-05 92 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