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; 
4

1 回答 1

0

假设Remove实际上从列表中删除了观察者,那么就这个数据结构而言,您不需要做任何其他事情。没有特别的理由来设置observers = null. 这只释放了用于观察者列表的少量内存,并且使您的代码复杂化,因为您必须null到处检查。例如,如果您的DetachAllsets observers = null,那么您Attach必须是:

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

我不建议DisposeDetach方法中调用观察者,因为观察者可能仍然是一个活动对象。

您可能不希望这是静态的。从灵活性和可测试性的角度来看,您最好使用实例对象。如果你真的需要确保你的程序不能创建它的多个实例,你可以实现一个单例设计模式,但这可能不是必需的。

于 2013-03-05T16:32:28.647 回答