观察者模式(observer pattern)

观察者模式:

    定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。

结构图:

C++实现:

class Observer;

class Subject {
public:
    virtual void attach(Observer *o) = 0;
    virtual void detach(Observer *o) = 0;
    virtual void notify() = 0;
};

class Observer {
public:
    virtual void update(int val) = 0;
};

class mySubject : public Subject {
private:
    set<Observer*> obs;
    int value;
public:
    void attach(Observer *o) { obs.insert(o); }
    void detach(Observer *o) { obs.erase(o); }
    void setVaule(int val) {
        value = val;
        notify();
    }
    void notify()
    {
        set<Observer*>::iterator it;
        for (it = obs.begin(); it != obs.end(); ++it)
        {
            (*it)->update(value);
        }
    }
    int getValue() { return value; }
};


class observerA : public Observer {
private:
    int value;
    Subject *psj;
public:
    observerA(Subject *p): psj(p) { psj->attach(this); }
    void update(int val)
    {
        value = val;
        display();
    }
    void display()
    {
        printf("current value: %d
", value);
    }
    ~observerA() { delete psj; }
};

class observerB : public Observer {
private:
    Subject *psj;
public:
    observerB(Subject *p): psj(p) { psj->attach(this); }
    void update(int val)
    {
        if (val > 0)
            printf("good news
");
        else
            printf("bad news
");
    }
    ~observerB() { delete psj; }
};

int main()
{
    mySubject subj;
    observerA a(&subj);
    observerB b(&subj);
    subj.setVaule(1);
    subj.detach(&a);
    subj.setVaule(2);
}

观察者模式涉及到的一个设计原则是:松耦合设计。改变subject或observer其中一方,并不会影响另一方。只要它们之间的接口仍被遵守,我们就可以自由地改变它们。

PS:

   观察者模式的一个例子是MVC,现在没接触到,先这样吧。。。

原文地址:https://www.cnblogs.com/gattaca/p/4737399.html