模式结构图:
代码示例:
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <windows.h>
using namespace std;
class IObserver
{
public:
virtual void onNotify(int value) = 0;
};
class INotifier
{
public:
virtual void registerListenner(IObserver *obs) = 0;
virtual void removeListenner(IObserver *obs) = 0;
virtual void Notify() = 0;
};
class MonitorNotifier : public INotifier
{
public:
void registerListenner(IObserver *obs)
{
m_Listenners.push_back(obs);
}
void removeListenner(IObserver *obs)
{
list<IObserver*>::iterator it;
for (it = m_Listenners.begin(); it != m_Listenners.end(); it++)
{
if (*it == obs)
{
m_Listenners.remove(obs);
break;
}
}
}
void Notify()
{
list<IObserver*>::iterator it;
for (it = m_Listenners.begin(); it != m_Listenners.end(); it++)
{
(*it)->onNotify(mValue);
}
}
void setValue(int value)
{
mValue = value;
Notify();
}
private:
list<IObserver*> m_Listenners;
int mValue;
};
class ZhangSan :public IObserver
{
public:
void onNotify(int value)
{
stopCopyWork(value);
}
void stopCopyWork(int value)
{
cout << "zhangsan stopCopyWork + " << value << endl;
}
};
class LiSi :public IObserver
{
public:
void onNotify(int value)
{
stopPlayGame(value);
}
void stopPlayGame(int value)
{
cout << "lisi stopPlayGame + " << value << endl;
}
};
int main()
{
cout << "Hello World1-------------" << endl;
MonitorNotifier monitor;
ZhangSan zs;
LiSi ls;
monitor.registerListenner(&zs);
monitor.registerListenner(&ls);
monitor.setValue(1);
cout << "Hello World2-------------" << endl;
monitor.removeListenner(&ls);
monitor.setValue(2);
return 0;
}