【发布时间】: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