优点:
1、目标和观察者之间松耦合
#include <iostream>
#include <list>
using namespace std;
//观察者
class Observer
{
public:
virtual void update(int) = 0;
};
//目标
class Subject
{
public:
virtual void attach(Observer *) = 0;
virtual void detach(Observer *) = 0;
virtual void notify() = 0;
};
//具体观察者1
class ConcreteObserver1 : public Observer
{
public:
ConcreteObserver1(Subject *subject):_subject(subject){}
void update(int value)
{
cout << "update ConcreteObserver1 state:" << value << endl;
}
private:
Subject *_subject;
};
//具体观察者2
class ConcreteObserver2 : public Observer
{
public:
ConcreteObserver2(Subject *subject):_subject(subject){}
void update(int value)
{
cout << "update ConcreteObserver2 state:" << value << endl;
}
private:
Subject *_subject;
};
//具体目标
class ConcreteSubject : public Subject
{
public:
void attach(Observer *observer)
{
_list.push_back(observer);
}
void detach(Observer *observer)
{
_list.remove(observer);
}
void notify()
{
list<Observer*>::iterator item = _list.begin();
while(item != _list.end())
{
(*item)->update(_state);
++item;
}
}
void setState(int state)
{
_state = state;
}
private:
list<Observer*> _list;
int _state;
};
int main()
{
ConcreteSubject *cSubject = new ConcreteSubject;
Observer *o1 = new ConcreteObserver1(cSubject);
Observer *o2 = new ConcreteObserver2(cSubject);
cSubject->setState(2);
cSubject->attach(o1);
cSubject->attach(o2);
cSubject->notify();
cSubject->detach(o2);
cSubject->setState(1);
cSubject->notify();
delete cSubject;
delete o1;
delete o2;
return 0;
}