</pre><pre>
- 目的 :当一个类(ConcreteObserverA、ConcreteObserverB)关心另外一个类(ConcreteSubjectA)的状态,希望如果ConcreteSubjectA的状态发生变化时,观察者(ConcreteObserverA、ConcreteObserverB)能够得到通知,并且执行一定的动作。
observer.h
ifndef OBSERVER_H_
#define OBSERVER_H_
#include <vector>
class Subject;
class Observer
{
public:
Observer(Subject* = NULL);
virtual ~Observer()
{}
virtual void update() const = 0;
protected:
Subject* subject;
};
class Subject
{
public:
virtual ~Subject()
{}
void attach(Observer&);
void dettach(Observer&);
void notify() const;
private:
std::vector<Observer*> observers;
};
class ConcreteObserverA: public Observer
{
public:
ConcreteObserverA(Subject*);
void update() const;
};
class ConcreteObserverB: public Observer
{
public:
ConcreteObserverB(Subject*);
void update() const;
};
class ConcreteSubjectA:public Subject
{
public:
void setState(std::string);
std::string getState();
private:
std::string state;
};
#endif /* OBSERVER_H_ */
observer.cpp
#include <iostream>
#include <vector>
#include "Observer.h"
using namespace std;
Observer::Observer(Subject* subject):subject(subject)
{
subject->attach(*this);
}
void Subject::attach(Observer& arg)
{
observers.push_back(&arg);
}
void Subject::dettach(Observer& arg)
{
}
void Subject::notify() const
{
vector<Observer*>::const_iterator it = observers.begin();
while(it != observers.end())
{
(*it)->update();
it++;
}
}
void ConcreteSubjectA::setState(string arg)
{
state = arg;
notify();
}
string ConcreteSubjectA::getState()
{
return state;
}
ConcreteObserverA::ConcreteObserverA(Subject* arg):Observer(arg)
{
}
void ConcreteObserverA::update() const
{
cout<<"ConcreteObserverA "<<(dynamic_cast<ConcreteSubjectA*>(subject))->getState()<<endl;
}
ConcreteObserverB::ConcreteObserverB(Subject* arg):Observer(arg)
{
}
void ConcreteObserverB::update() const
{
cout<<"ConcreteObserverB "<<(dynamic_cast<ConcreteSubjectA*>(subject))->getState()<<endl;
}
void observer()
{
ConcreteSubjectA subject;
ConcreteObserverA o1(&subject);
ConcreteObserverB o2(&subject);
subject.setState("old");
subject.setState("new");
}