我有观察者设计模式,并且通过静态方法完成附加/分离所需的观察者。我使用静态方法,因为每个节点的观察者列表在内存方面可能会花费很多。如果我从设计的角度来看错了,请告诉我(使用静态方法和变量是否正确?)。
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;
答案 0 :(得分:0)
假设Remove
实际上从列表中删除了观察者,那么就这个数据结构而言,您无需做任何其他事情。设置observers = null
没有特别的理由。这只会释放用于观察者列表的少量内存,并且会使代码复杂化,因为您必须在任何地方检查null
。例如,如果您的DetachAll
设置observers = null
,那么您的Attach
必须是:
if (observers == null)
{
// create observers list
}
observers.Add(observer);
我不建议在Dispose
方法中对观察者调用Detach
,因为观察者可能仍然是活动对象。
你可能不希望这是静态的。从灵活性和可测试性的角度来看,您最好使用实例对象。如果您确实需要确保程序无法创建多个实例,则可以实现单例设计模式,但这可能不是必需的。