Design patterns 从集合中删除

Design patterns 从集合中删除,design-patterns,collections,Design Patterns,Collections,我有一组a类的实例。 在某个点上,的实例意识到它应该删除自己。我想把这件事告诉收藏家,但我不想让他们知道有关收藏品的任何事情 最好的办法是什么?在我看来,了解这个系列是非常糟糕的,但是如果我错了,让我知道。现在,我正在考虑使用类似的东西,一个can实例触发一个事件,集合正在监听该事件。然后,当集合捕获该事件时,删除触发该事件的实例 关于这一点的任何想法都会很有帮助,感谢您在描述Observer模式(又名:发布/订阅)时加入设计模式 实例将容纳一个侦听器。删除时,A将调用侦听器上的onDelete

我有一组a类的实例。 在某个点上,的实例意识到它应该删除自己。我想把这件事告诉收藏家,但我不想让他们知道有关收藏品的任何事情

最好的办法是什么?在我看来,了解这个系列是非常糟糕的,但是如果我错了,让我知道。现在,我正在考虑使用类似的东西,一个can实例触发一个事件,集合正在监听该事件。然后,当集合捕获该事件时,删除触发该事件的实例


关于这一点的任何想法都会很有帮助,感谢您在描述Observer模式(又名:发布/订阅)时加入设计模式

实例将容纳一个侦听器。删除时,A将调用侦听器上的onDelete方法,并将其自身作为参数传递。集合将实现侦听器接口


另一种选择是责任链模式

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

如果集合是无序集合(在.NET中为ICollection),则还有另一种解决方案。您可以将IsDeleted属性添加到类A中,将其设置为true,然后将其删除。在collection类中,您可以假装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
}
A类{
公共布尔被删除{get;set;}
}
类别A集合:I集合{
私有列表_innerList=新列表();
#区域i集合成员
公共作废添加(项目){
_innerList.Add(项);
}
公共空间清除(){
_Clear();
}
公共bool包含(一个项目){
如果(项目已删除)
返回false;
返回_innerList.Contains(项);
}
public void CopyTo(A[]数组,int arrayIndex){
抛出新的NotImplementedException();
}
公共整数计数{
得到{
整数计数=0;
foreach(内部列表中的变量项){
如果(!item.IsDeleted)
计数++;
}
返回计数;
}
}
公共图书馆是只读的{
获取{return false;}
}
公共布尔删除(项目){
返回_innerList.Remove(项目);
}
#端区
#区域可数成员
公共IEnumerator GetEnumerator(){
foreach(内部列表中的变量项){
如果(!item.IsDeleted)
收益回报项目;
}
}
#端区
#区域可数成员
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){
foreach(内部列表中的变量项){
如果(!item.IsDeleted)
收益回报项目;
}
}
#端区
}

两个问题:您使用的语言是否支持垃圾收集?您使用的是内置事件的语言吗?没有垃圾收集,但在事件处理上是。但是在您描述的内容中,a不需要知道调用OnDelete方法是在集合中吗?a与定义OnDelete()方法的接口耦合。它不与集合本身耦合。