我建议定义一个类,该类跟踪其子类是否通过一个标志(例如名为
Dirty
. 树中的节点可以通过引发事件来告诉其父节点变脏。当一个节点返回它自己的值时,它应该检查标志并仅在需要时重新计算它自己的值。在重新计算时,它应该检查每个子级的值,然后每个子级递归地检查自己的脏标志,依此类推。
class Node<T>
{
event EventHandler Changed;
private T _value;
private bool _dirty = true;
private List<Node<T>> _children = new List<Node<T>>();
public void AddChild(Node<T> child)
{
child.Changed += (s,e) => _dirty = true;
_children.Add(child);
}
protected void OnChanged()
{
if (Changed != null) Changed(this, new EventArgs());
}
public T Value
{
get
{
if (_dirty)
{
this.Value = ComputeValueFromChildren();
_dirty = false;
}
return _value;
}
set
{
_value = value;
OnChanged();
}
}
private T ComputeValueFromChildren()
{
var values = _children.Select( child => child.Value );
//Return the new value based on the children
}
}