设计模式之- 观察者模式(Observer Pattern)

Posted j1ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之- 观察者模式(Observer Pattern)相关的知识,希望对你有一定的参考价值。

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
 
C++代码:
#include<iostream>
#include<vector>

using namespace std;

class Subject;

class Obeserver{//观察者
public:
    Obeserver(){};
    virtual ~Obeserver(){};
    virtual void update(Subject * sub) = 0;
};


class Subject{//被观察者
public:
    Subject(){};
    virtual ~Subject(){};
    Obeserver *m_Obeserver;

    void attach(Obeserver * pObeserver){
        m_vtObj.push_back(pObeserver);
    }
    void detach(Obeserver * pObeserver){
        for(auto itr = m_vtObj.begin();itr != m_vtObj.end(); ++itr){
            if(*itr == pObeserver){
                m_vtObj.erase(itr);
                return;
            }            
        }
    }
    void notify(){
        for(auto itr = m_vtObj.begin();itr != m_vtObj.end(); ++itr){    
            (*itr)->update(this);        
        }
    }
        
    virtual int getState() = 0;
    virtual void setState(int i) = 0;
private:
    vector<Obeserver*> m_vtObj;
};



class ConcreteObeserver : public Obeserver{//具体的观察者
public:
    ConcreteObeserver(string name){m_objName = name;}
    ~ConcreteObeserver(){}
    void update(Subject * sub){
        m_observerState = sub->getState();
        cout << "update oberserver["<< m_objName << "] state:" << m_observerState << endl;
    }
private:
    string m_objName;
    int m_observerState;
};



class ConcreteSubject :public Subject{//具体的被观察者
public:
    int getState(){return state;}
    void setState(int i){state = i;}
private:
    int state = 0;
};


int main(int argc, char *argv[])
{
    Subject * subject = new ConcreteSubject();
    Obeserver * objA = new ConcreteObeserver("A");
    Obeserver * objB = new ConcreteObeserver("B");
    subject->attach(objA);
    subject->attach(objB);
    
    subject->setState(1);
    subject->notify();
    
    cout << "---------------------------------------------" << endl;
    subject->detach(objB);
    subject->setState(2);
    subject->notify();

    return 0;
}

类图:

技术分享图片

观察者模式在注册回调这种应用中比较常用,很有用的一种设计模式了。

以上是关于设计模式之- 观察者模式(Observer Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之观察者模式(Observer)

GOF23设计模式之观察者模式(observer)

设计模式之二:观察者模式(Observer Pattern)

设计模式之- 观察者模式(Observer Pattern)

行为型模式之Observer模式

观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别