1.观察者模式简介
观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
2.源码实现
#include <iostream>
#include <string>
#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;
};
class ConcreteObserver : public Observer
{
public:
ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){};
void Update(int value)
{
cout << "ConcreteObserver get the update New State: " << value << endl;
}
private:
Subject *m_pSubject;
};
class ConcreteObserver2 : public Observer
{
public:
ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){};
void Update(int value)
{
cout << "ConcreteObserver2 get the update New State: " << value << endl;
}
private:
Subject *m_pSubject;
};
class ConcreteSubject : public Subject
{
public:
void Attach(Observer *pObserver)
{
m_ObserverList.push_back(pObserver);
}
void Detach(Observer *pObserver)
{
m_ObserverList.remove(pObserver);
}
void Notify()
{
list<Observer *>::iterator it = m_ObserverList.begin();
while(it != m_ObserverList.end())
{
(*it)->Update(m_iState);
it++;
};
}
void SetState(int state)
{
m_iState = state;
}
private:
list<Observer *> m_ObserverList;
int m_iState;
};
int main(int argc, char **argv)
{
ConcreteSubject *pSubject = new ConcreteSubject();
Observer *pObserver = new ConcreteObserver(pSubject);
Observer *pObserver2 = new ConcreteObserver2(pSubject);
pSubject->SetState(2);
pSubject->Attach(pObserver);
pSubject->Attach(pObserver2);
pSubject->Notify();
pSubject->Detach(pObserver);
pSubject->SetState(3);
pSubject->Notify();
delete pObserver;
delete pObserver2;
delete pSubject;
return 0;
}
3.编译源码
$ g++ -o example example.cpp
4.运行及其结果
$ ./example
ConcreteObserver get the update New State: 2
ConcreteObserver2 get the update New State: 2
ConcreteObserver2 get the update New State: 3
网友评论