从集合中删除

时间:2009-08-07 05:26:12

标签: design-patterns collections

我有一组A类的实例。 在某些时候,A的实例意识到它应该删除自己。我想通知这个集合,但我不希望A知道有关该集合的任何信息。

最好的方法是什么?在我看来,像A知道收集是非常糟糕的耦合,但如果我错了让我知道。现在我正在考虑使用类似的东西,A的一个实例可以触发一个集合正在监听的事件。然后,当集合捕获事件时,删除触发它的实例。

对此有任何想法都会有所帮助,谢谢

2 个答案:

答案 0 :(得分:1)

事件可能是最好的解决方案。

如果集合是无序集合(.NET中的ICollection),还有另一种解决方案。您可以向类A添加IsDeleted属性,将其设置为true然后将其删除。在您的集合类中,您可以假装具有IsDeleted = true的对象不存在。

这样的事情:

class A {
    public bool IsDeleted { get; set; }
}

class ACollection : ICollection<A> {
    private List<A> _innerList = new List<A>();

    #region ICollection<A> Members

    public void Add(A item) {
        _innerList.Add(item);
    }

    public void Clear() {
        _innerList.Clear();
    }

    public bool Contains(A item) {
        if(item.IsDeleted)
            return false;
        return _innerList.Contains(item);
    }

    public void CopyTo(A[] array, int arrayIndex) {
        throw new NotImplementedException();
    }

    public int Count {
        get {
            int count = 0;
            foreach(var item in _innerList) {
                if(!item.IsDeleted)
                    count++;
            }
            return count;
        }
    }

    public bool IsReadOnly {
        get { return false; }
    }

    public bool Remove(A item) {
        return _innerList.Remove(item);
    }

    #endregion

    #region IEnumerable<A> Members

    public IEnumerator<A> GetEnumerator() {
        foreach(var item in _innerList) {
            if(!item.IsDeleted)
                yield return item;
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
        foreach(var item in _innerList) {
            if(!item.IsDeleted)
                yield return item;
        }
    }

    #endregion
}

答案 1 :(得分:0)

根据设计模式,您将描述观察者模式(AKA:发布/订阅)。

A的实例将拥有一个监听器。当A被删除时,A将调用侦听器上的onDelete方法,将其自身作为参数传递。该集合将实现监听器接口。

另一种选择是责任链模式。