行为模式:Observer 观察者模式
目录

观察者模式定义了对象之间一对多依赖。 这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式也称发布-订阅(publish-subscribe)摸索。

  • Subject 被观察的主题
  • Observer 观察者
class Subject {
public:
Subject();
virtual ~Subject();

virtual void registerObserver(Observer*);
virtual void removeObserver(Observer*);
virtual void notifyObservers();
private:
List<Observer*> _observers;
};

void Subject::registerObserver(Observer* o)
{
_observers.add(o);
}

void Subject::removeObserver(Observer* o)
{
_observers.remove(o);
}

void Subject::notifyObservers()
{
foreach o in _observer:
o->update(this);
}

主题只需知道观察者的接口,而不用知道观察者具体做了什么。 因此可以自由增加Observer的派生类。

class Observer {
public:
Observer();
virtual ~Observer();

virtual void update(Subject* theChangedSubject) = 0;
};

注意update参数是主题(派生)对象的指针。 这样可以知道哪个观察的主题对象发生了变化,这样进一步和Subject解耦,有助于观察多个目标。

void D::update(Subject* theChangedSubject)
{
if (thisChangeSubject == _subject)
{
draw();
}
}

void D::draw()
{
_subject->getA();
...
}

观察者模式还有一个触发问题:谁来触发更新。 是由主题把更新给观察者,还是由观察者取主题更新。

  • 如果由主题推,则主题对象在状态更新后调用notifyObservers()。缺点是连续更新会连续地推,可能效率低。
  • 如果由观察者拉,则观察者对象定期调用notifyObservers(),这样可以避免不必要得更新,但是会给观察予触发的责任。

Java中的观察者模式:java.util.Observer和java.util.Obserable,在update中使用instanceof方法判断类型。

发表评论