观察者模式
常用的设计模式之一
原理
被观察者保留了观察者实例的地址与函数名,当有事件触发或主动调用Notify()时,通过实例的this指针类型与函数名就可以回调观察者函数
实现
Observer.h:先定义观察者
,因为观察者会被被观察者
拿去用
#include <iostream>
#include <list>
using namespace std;
class Observer
{
public:
virtual void Update(int) = 0;
};
class ConcreteObserver : public Observer
{
public:
void Update(int value){
cout<<"ConcreteObserver get the update. New State:"<<value<<endl;
}
};
class ConcreteObserver2 : public Observer
{
public:
void Update(int value){
cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl;
}
};
Subject.h: 定义一个观察者列表,有需要对被观察者做出响应的实例追加到该列表
#include<iostream>
#include"Observer.h"
class Subject
{
public:
virtual void Attach(Observer *) = 0;
virtual void Detach(Observer *) = 0;
virtual void Notify() = 0;
};
class ConcreteSubject : public Subject
{
public:
void Attach(Observer *pObserver){
m_ObserverList.push_back(pObserver);
}
void Detach(Observer *pObserver){
m_ObserverList.remove(pObserver);
}
void Notify(){
std::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:
std::list<Observer *> m_ObserverList;
int m_iState;
};
测试:
#include <iostream>
#include <list>
#include"Subject.h"
using namespace std;
int main()
{
// Create Subject
ConcreteSubject *pSubject = new ConcreteSubject();
// Create Observer
Observer *pObserver = new ConcreteObserver();
Observer *pObserver2 = new ConcreteObserver2();
// Change the state
pSubject->SetState(2);
// Register the observer
pSubject->Attach(pObserver);
pSubject->Attach(pObserver2);
pSubject->Notify();
// Unregister the observer
pSubject->Detach(pObserver);
pSubject->SetState(3);
pSubject->Notify();
delete pObserver;
delete pObserver2;
delete pSubject;
}