我有一组A类的实例。 在某些时候,A的实例意识到它应该删除自己。我想通知这个集合,但我不希望A知道有关该集合的任何信息。
最好的方法是什么?在我看来,像A知道收集是非常糟糕的耦合,但如果我错了让我知道。现在我正在考虑使用类似的东西,A的一个实例可以触发一个集合正在监听的事件。然后,当集合捕获事件时,删除触发它的实例。
对此有任何想法都会有所帮助,谢谢
答案 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方法,将其自身作为参数传递。该集合将实现监听器接口。
另一种选择是责任链模式。