【问题标题】:How can I sync three classes?如何同步三个类?
【发布时间】:2010-05-11 07:29:43
【问题描述】:
class Foo
{
    Bar b;
    List<Foo> Neighbours;
}

class Bar
{
    Spam s;
    List<Bar> Neighbours;
}

class Spam
{
    List<string> Neighbours; 
}

每个类都有AddNeighbour,RemoveNeighbour 方法。

用户可以从任何类中随机添加/删除邻居。

我希望这三个对象同步

我该怎么做?

【问题讨论】:

  • 你能提供更多关于你想要达到的目标的信息吗?
  • @UpTheCreek 我需要同步三个图表。它们的基本结构类似于上图。
  • 如果将string 邻居添加到Spam,您期望什么行为?那么FooBar 对象是如何创建的呢?
  • 嗯,我刚刚看到您在 Bar 中引用了相应的 Spam,并且与 FooBar 相同。所以我猜你不希望任何人添加FooSpam
  • 将它们分开的原因是什么?当然你有充分的理由。代理模式? Spam 在密封的图书馆里吗?

标签: c# design-patterns oop


【解决方案1】:

选项一 - 更新时让 Foo 调用 Bar,让 Bar 调用 Spam。这将导致紧密耦合的对象,您可能还需要让 Spam 回调 Bar,后者回调 Foo 以在另一个方向同步,yuk。

选项二 - 拥有一个观察三个对象中的每一个并在其中一个对象发生变化时更新其他对象的类。 (外部同步器)

选项三 - 修改设计并将数据存储在 ONE 类中,并实现三个以 List、List 或 List 形式返回数据的接口。这样,您可以选择将数据存储一次(并根据要求进行转换)或更轻松地保持对象的三个内部列表同步。

选项四 - 拥有一个已更新的通用数据模型,每个对象都会观察并从数据模型同步它自己的内部列表

编辑 - 根据您的评论,这是针对三个图的,观察者模式可能是执行此操作的最佳方式。拥有一个共同的数据模型,每个模型都在观察并适应其服务图所需的特定类型。

【讨论】:

  • 肯定会选择选项三或四。为了让公共列表的观察更容易一些,您可以使用BindingList&lt;T&gt; 并轻松通知观察者有关基础列表中的任何更改。
【解决方案2】:

一种方法是使用Observer pattern

您可以让每个对象向观察者注册自己, 当任何对象发生变化时,它会通知观察者,然后观察者会更新所有其他订阅者。

HTH

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多