首页 > 代码库 > 设计模式初探2——观察者模式(Observer Pattern)

设计模式初探2——观察者模式(Observer Pattern)

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


典型使用情况:某个对象掌握数据,当数据更新时通知多个对象更新显示(参考MVC)。

在java内置的Observer模式中支持“push”和“pull”两种方式,一般好像push更多一点,下面就以push为例:


UML图:



依然上一段测试代码:

#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

class Observer {
public:
    virtual void update(string str) = 0;
};

class Subject {
public:
    virtual void registerObserver(Observer*) = 0;
    virtual void removeObserver(Observer*) = 0;
    virtual void notifyObserver() = 0;
};
// 显示数据接口
class Display {
public:
    virtual void display() = 0;
};

class SubjectImpl : public Subject {
public:
    SubjectImpl(){
        info = "123";
    }

    void registerObserver(Observer* o){
        observers.push_back(o);
    }

    void removeObserver(Observer* o)
    {
        list<Observer*>::iterator it = find(observers.begin(), observers.end(), o);
        if ( it != observers.end() )
            observers.remove(o);
    }

    void notifyObserver(){
        list<Observer*>::iterator it = observers.begin();
        while(it != observers.end()) {
            (*it)->update(info);
            ++it;
        }
    }
    // 模拟数据发生改变
    void dataChanged(){
        info = "456";
        notifyObserver();
    }

private:
    list<Observer*> observers;
    string info;
};

class ObserverImpl : public Observer, public Display{
public:
    ObserverImpl(Subject* sub){
        mySubject = sub;
        mySubject->registerObserver(this);
    }

    void update(string str)
    {
        data = http://www.mamicode.com/str;>

设计模式初探2——观察者模式(Observer Pattern)