观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用场景:
1、一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中,使它们可以各自独立地改变和复用。
2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
3、一个对象必须通知其他对象,而并不知道这些对象是谁。
4、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<vector>
using namespace std;
class Observer;
class Subject
{
public:
Subject() {};
~Subject() {};
int getState();
void setState(int tstate);
void attach(Observer *tobserver);
void notifyAllObservers();
private:
vector<Observer*> observers;
int state;
};
int Subject::getState()
{
return state;
}
void Subject::setState(int tstate)
{
this->state = tstate;
}
void Subject::attach(Observer *tobserver)
{
observers.push_back(tobserver);
}
class Observer
{
public:
Observer() {};
~Observer() {};
virtual void update()=0;
protected:
Subject *msubject;
};
void Subject::notifyAllObservers()
{
vector<Observer*>::iterator it;
for (it = observers.begin(); it != observers.end(); ++it)
{
(*it)->update();
}
}
class BinaryObserver :public Observer
{
public:
BinaryObserver(Subject *tsubject);
~BinaryObserver() {};
void update();
};
BinaryObserver::BinaryObserver(Subject *tsubject)
{
this->msubject = tsubject;
this->msubject->attach(this);
}
void BinaryObserver::update()
{
cout << "Binary string: " << msubject->getState() << endl;
}
class OctalObserver :public Observer
{
public:
OctalObserver(Subject *tsubject);
~OctalObserver() {};
void update();
};
OctalObserver::OctalObserver(Subject *tsubject)
{
this->msubject = tsubject;
this->msubject->attach(this);
}
void OctalObserver::update()
{
cout << "Octal string: " << msubject->getState() << endl;
}
class HexaObserver :public Observer
{
public:
HexaObserver(Subject *tsubject);
~HexaObserver() {};
void update();
};
HexaObserver::HexaObserver(Subject *tsubject)
{
this->msubject = tsubject;
this->msubject->attach(this);
}
void HexaObserver::update()
{
cout << "Hex string: " << msubject->getState() << endl;
}
int main()
{
Subject *subj = new Subject();
BinaryObserver *Bina = new BinaryObserver(subj);
OctalObserver *Octa = new OctalObserver(subj);
HexaObserver *Hexa = new HexaObserver(subj);
cout << "First state change: 15" << endl;
subj->setState(15);
subj->notifyAllObservers();
cout << "Second state change: 10" << endl;
subj->setState(10);
subj->notifyAllObservers();
system("pause");
return 0;
}
在visual studio 2015上运行结果: