适用模式:多个观察者同时监听一个主题对象.
// 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;
}