观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
Subject: 目标, 即被观察者(基类)
ConcreteSubject: 具体目标, 即具象的被观察者(子类)
Observer: 观察者
ConcreteObserver: 具体观察者
观察者模式的流程是:被观察者执行某个动作被观察者察觉到(其实是被观察者执行动作后通知了观察者),继而观察者执行了某个操作
往往的理解中会掺杂执行者这个概念,但其实观察者模式中根本就没有执行者,如“老师说上课,班长喊起立,同学们起立喊老师好”,这个例子中,往往就会理解不透彻,以为老师是被观察者,班长是观察者,同学们是执行者,这个就是错误的理解。
真正正确的理解是:老师和班长是一对一的观察者模式,班长和同学们是一对多的观察者模式,这个例子中包含两个观察者模式。老师是被观察者,班长是观察者;同时,班长是另一个模式里的被观察者,同学们是观察者
//观察者
class Observer
{
public:
virtual void Update() = 0;
};
//被观察者
class Subject
{
public:
virtual void Bind(Observer *) = 0;
virtual void Unbound(Observer *) = 0;
virtual void Notify() = 0;
};
//具体观察者
class ConcreteObserver : public Observer
{
public:
ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject) {}
void Update()
{
cout << "ConcreteObserver1 get the signal, to do something"<< endl;
}
private:
Subject *m_pSubject;
};
class ConcreteObserver2 : public Observer
{
public:
ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject) {}
void Update()
{
cout << "ConcreteObserver2 get the signal, to do something"<< endl;
}
private:
Subject *m_pSubject;
};
//具体被观察者
class ConcreteSubject : public Subject
{
public:
void Bind(Observer *pObserver);
void Unbound(Observer *pObserver);
void Notify();
void SomeoneOperation()
{
//被观察者执行某个操作,会被观察者所捕捉到,即通知了所有观察者
Notify();
}
private:
std::list<Observer *> m_ObserverList;
};
void ConcreteSubject::Bind(Observer *pObserver)
{
if (pObserver != nullptr)
{
m_ObserverList.push_back(pObserver);
}
}
void ConcreteSubject::Unbound(Observer *pObserver)
{
if (!m_ObserverList.empty())
{
m_ObserverList.remove(pObserver);
}
}
void ConcreteSubject::Notify()
{
std::list<Observer *>::iterator it = m_ObserverList.begin();
while (it != m_ObserverList.end())
{
(*it)->Update();
++it;
}
}
int main()
{
// Create Subject
ConcreteSubject *pSubject = new ConcreteSubject();
// Create Observer
Observer *pObserver = new ConcreteObserver(pSubject);
Observer *pObserver2 = new ConcreteObserver2(pSubject);
// Register the observer
pSubject->Bind(pObserver);
pSubject->Bind(pObserver2);
// Change the state
pSubject->SomeoneOperation();
delete pObserver;
delete pSubject;
getchar();
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容