可观察树 - 事件会发生什么?

时间:2010-09-09 11:33:26

标签: c# architecture observer-pattern

我有一个自定义树数据类,遵循标准Composite模式。我显然不希望GUI和模型过于紧密联系,因此GUI应该是模型的Observer,并且应该通过模型层进行更改。我正在使用C#事件实现可观察的支持 - 到目前为止,非常好,我有一个工作系统。

  1. 您希望生成可观察树的哪些事件? NodeCreate,NodeDelete,NodeMove?
  2. 您是否会在TreeChange中创建一个TreeChangeEventArgs事件并对更改信息进行编码,或者您是否会为每种更新类型创建一个事件(可能还会为每个事件创建特定的EventArg类)?
  3. NodeDeletingNodeDeleted?如果没有将已删除的节点作为参数,NodeDeleted似乎对我的使用非常有限?当然,树可以在(可能)处理节点之前触发NodeDeleted事件,但是抛出一个(至少在概念上)删除的节点是不错的做法?
  4. 删除包含子节点的节点时,您希望获得单个NodeDeleted事件,还是递归NodeDeleted子节点?单NoteDeleted对我来说似乎很好,但也许有些情况我没有考虑过。
  5. 单个节点的更改,而不是树结构的更改。我假设最好通过观察单个节点来处理这个问题? (我目前正在使用节点类上的INotifyPropertyChanged来处理它。)
  6. 不,我不想使用Windows.Forms.TreeView作为我的主要数据结构:)
  7. 并且,奖励问题:让客户直接操纵树节点并让树本身触发事件,或者按照Service.Instance.AddNode(parentNode, "New node name")的方式执行某些操作并让Service类负责生成事件?

1 个答案:

答案 0 :(得分:0)

  1. 我肯定会添加NodeChange,如果没有能力在节点中存储值,那么树的用途是什么?其他事件取决于树应该支持的所有内容,例如对于自平衡树,您可以使用NodeRotate事件等。绝对允许引入自定义事件以供将来使用。
  2. 我更喜欢基于OO原则的设计,比如多态行为,所以不同的子类就是我的答案。
  3. 此事件对于UI很重要,解决您的困境的简单方法是向节点添加某种ID,因此可以在UI中隐藏树模型中的已删除节点。
  4. 取决于您的删除语义,例如您可能希望删除单个节点并将其所有子节点连接到已删除节点的父节点。但是,对于复合结构,单个递归删除似乎更合理。
  5. 您必须考虑节点和树之间的关系。我会优先选择节点的特殊事件,这会在需要时生成树事件。
  6. 我不是.Net的人,但总是考虑是否有现成的东西无法调整以满足您的要求。
  7. Bonus:我认为属于树的行为应该在树中,要改变它你有多态性和继承,不要使用结构设计,其中OO在OO系统中更有意义。