【问题标题】:Notifying observers from nested structures从嵌套结构通知观察者
【发布时间】:2011-07-11 09:52:49
【问题描述】:

目前,我试图通过引入 MVC 模式来剖析应用程序中数据模型和 UI 之间的一些紧密耦合。基本上,这意味着让模型知道关联的视图,以便在模型内的属性发生变化时通知它们。

数据模型由嵌套结构表示:

Model
- Node
  - Leaf
  - Leaf
- Node
  - Leaf

每个元素都继承自一个通用抽象基类 (StructuredNode)。

我一直在考虑的问题是:观察者应该能够订阅模型(并且只能订阅模型),但每个元素都应该能够发出更改通知。这可以通过两种方式实现 - 通知在层次结构中向上路由,直到它们到达模型,在那里它们被推送到观察者,或者通过在基类中实现通知,使用静态观察者列表,如下例所示:

public abstract class Base {

  private static Map<IObserver> observers;


  protected synchronized void internalSubscribe(final IObserver observer) {
    observers.add(observer);
  }

  protected synchronized void notifyObservers(final Base obj) {
    for (IObserver observer : observers)
      observer.changed(obj);
  }

  // .. other base class operations
}

在这个实现中,只有 Model 会提供一个公共订阅方法,该方法在内部将委托给基类的受保护的 internalSubscribe 方法。同时,基类的每个派生类都可以发送变更通知,如下所示:

// Perform some operations that change the object's internal state
// ...
// Then notify all observers
notifyObservers(this);

这是相当好的做法还是相当糟糕的做法(使用静态观察者列表)?对此有何看法?有其他解决方案吗?

【问题讨论】:

    标签: oop design-patterns observer-pattern


    【解决方案1】:

    静态观察者列表不是一个常见的解决方案,我认为它不是通用使用模型的好习惯。

    观察者将被通知他们不感兴趣的模型的更改。这意味着识别触发通知的模型的所有负担都落在观察者身上,他们可能没有好的和有效的方法来做这件事,除了上去层次结构和查找根节点......很多代码,必须在多个观察者中实现多次。最后,即使更新后的模型不是它感兴趣的模型,观察者也可以更简单地忽略考虑而只更新或重新计算。

    当然,这一切可能不适用于您的情况。如果您知道您的应用程序中不会有多个此类的模型,那么您可以很好地使用此解决方案。

    无论如何,只有具有公共订阅方法的模型的要求不应限制您使用静态观察者容器在所有模型实例之间共享。正如你所说,还有另一种方法。恕我直言,将通知向上传递层次结构是正确的方法。

    如果您想避免路由,则可以选择让节点保留对其模型的引用。如果您知道树结构将很深且不是很动态,这可能会更有效。如果节点可以从一个模型移动到另一个模型,那么这有点冒险,并且需要一些进一步的代码来保持引用的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2021-05-02
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多