设计模式-观察者模式

来源:互联网 发布:xmind是什么软件 编辑:程序博客网 时间:2024/06/05 16:09

适用模式:多个观察者同时监听一个主题对象.

这里写图片描述

// subject.h#ifndef SUBJECT_H#define SUBJECT_H#include <vector>#include "observer.h"class Observer;class Subject{public:    Subject();    virtual void Attach(Observer * observer) = 0;    virtual void Nofity() = 0;public:    int m_message;    std::vector<Observer*> m_observers;};#endif // SUBJECT_H
// subject.cpp#include "subject.h"Subject::Subject(){    m_message = 0;}
// concretesubject.h#ifndef CONCRETESUBJECT_H#define CONCRETESUBJECT_H#include "subject.h"class ConcreteSubject : public Subject{public:    ConcreteSubject();    virtual void Attach(Observer * observer);    virtual void Nofity();};#endif // CONCRETESUBJECT_H
// concretesubject.cpp#include "concretesubject.h"ConcreteSubject::ConcreteSubject(){}void ConcreteSubject::Attach(Observer *observer){    m_observers.push_back(observer);}void ConcreteSubject::Nofity(){    std::vector<Observer*>::iterator it = m_observers.begin();    while( it != m_observers.end())    {        (*it)->Update();        it++;    }}
// observer.h#ifndef OBSERVER_H#define OBSERVER_H#include "subject.h"class Subject;class Observer{public:    Observer(int state, Subject *sub);    virtual void Update() = 0;public:    int m_state;    Subject *m_sub;};#endif // OBSERVER_H
// observer.cpp#ifndef CONCRETESUBJECT_H#define CONCRETESUBJECT_H#include "subject.h"class ConcreteSubject : public Subject{public:    ConcreteSubject();    virtual void Attach(Observer * observer);    virtual void Nofity();};#endif // CONCRETESUBJECT_H
// concreteobserver.h#ifndef CONCRETEOBSERVER_H#define CONCRETEOBSERVER_H#include "observer.h"class ConcreteObserver : public Observer{public:    ConcreteObserver(int state, Subject *sub);    virtual void Update();};#endif // CONCRETEOBSERVER_H
// concreteobserver.cpp#include "concreteobserver.h"#include <iostream>ConcreteObserver::ConcreteObserver(int state, Subject *sub) : Observer(state, sub){}void ConcreteObserver::Update(){    m_state = m_sub->m_message + 10000;    std::cout << m_sub->m_message << ":::" << m_state << std::endl;}

客户端:

// main.cpp#include <iostream>#include "subject.h"#include "observer.h"#include "concreteobserver.h"#include "concretesubject.h"using namespace std;int main(int argc, char *argv[]){    Subject *sub = new ConcreteSubject();    Observer *observer = new ConcreteObserver(0, sub);    sub->Attach(observer);    sub->m_message = 2;    sub->Nofity();    return 0;}
0 0