观察者模式C++实现

观察者模式C++实现

#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef string State;

class Observer;

// 目标
class Subject {
public:
    Subject() {}
    virtual ~Subject() {}

    virtual void Attach(Observer *pObserver);
    virtual void Detach(Observer *pObserver);
    virtual void Notify();
    virtual State GetState()=0;
    virtual void SetState(const State& nState)=0;
private:
    vector<Observer*> m_observers;
};

// 具体目标
class ConcreteSubject : public Subject {
public:
    ConcreteSubject() {}
    virtual ~ConcreteSubject() {}

    virtual State GetState();
    virtual void SetState(const State& nState);
private:
    State m_State;
};

// 观察者
class Observer {
public:
    Observer() {}
    virtual ~Observer(){}

    virtual void Update(Subject* pSubject)=0;
};

// 具体观察者
class ConcreteObserver : public Observer {
public:
    ConcreteObserver(string nSubjectName, Subject * pSubject);
    virtual ~ConcreteObserver();

    virtual void Update(Subject* pSubject);
private:
    string m_SubjectName;
    State m_State;
    Subject *m_pSubject;
};

// Subject
void Subject::Attach(Observer *pObserver) {
    m_observers.push_back(pObserver);
}
void Subject::Detach(Observer *pObserver) {
    for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
        if (*iter == pObserver) {
            m_observers.erase(iter);
            return;
        }
    }
}
void Subject::Notify() {
    for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
        (*iter)->Update(this);
    }
}

// ConcreteSubject
State ConcreteSubject::GetState() {
    return m_State;
}
void ConcreteSubject::SetState(const State& nState) {
    m_State = nState;
}

// ConcreteObserver
ConcreteObserver::ConcreteObserver(string nSubjectName, Subject * pSubject) {
    m_SubjectName = nSubjectName;
    m_pSubject = pSubject;
    m_pSubject->Attach(this);
}
ConcreteObserver::~ConcreteObserver() {
    m_pSubject->Detach(this);
    if (m_pSubject != 0) delete m_pSubject;
}
void ConcreteObserver::Update(Subject* pSubject) {
    m_State = pSubject->GetState();
    cout << "observer name: " << m_SubjectName << "    " << "state: " << m_State << endl;
}

int main() {
    ConcreteSubject * pConcreteSubject = new ConcreteSubject();
    Observer * o1 = new ConcreteObserver("observer1",pConcreteSubject);
    Observer * o2 = new ConcreteObserver("observer2",pConcreteSubject);
    pConcreteSubject->SetState("State_1");
    pConcreteSubject->Notify();
    pConcreteSubject->SetState("State_2");
    pConcreteSubject->Notify();
    return 0;
}

原文链接: https://www.cnblogs.com/wstong/p/12831539.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    观察者模式C++实现

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/346433

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午3:53
下一篇 2023年3月2日 上午3:53

相关推荐