观察者模式
观察者模式也叫发布/订阅模型, 被观察者的状态改变,会传递一个消息(事件)给观察者们.
// 观察者
class IObserver
{
public:
IObserver() {}
virtual ~IObserver() {}
public:
virtual void update() = 0;
};
// 被观察者
class ISubject
{
public:
ISubject() {}
virtual ~ISubject() {}
public:
// 添加观察者
void attach(IObserver* observer) {
if (observer == NULL) {
return;
}
for (auto it : observerVec) {
if (it == observer)
return;
}
observerVec.push_back(observer);
}
// 删除观察者
void detach(IObserver* observer) {
if (observer == NULL) {
return;
}
for (vector<IObserver*>::iterator it = observerVec.begin();it != observerVec.end();++it) {
if (*it == observer) {
observerVec.erase(it);
break;
}
}
}
// 通知观察者
void notify() {
for (auto it : observerVec) {
if (it != NULL) {
it->update();
}
}
}
private:
vector<IObserver*> observerVec;
};
// 具体被观察者
class concreteSubject:public ISubject
{
public:
concreteSubject() {}
~concreteSubject() {}
public:
void doSomething() {
cout << "我是被观察者,我正在..." << endl;
ISubject::notify();
}
};
//观察者A
class observerA : public IObserver
{
public:
observerA() {}
~observerA() {}
public:
virtual void update() {
cout << "我是观察者A, 我观察到..." << endl;
}
};
//观察者B
class observerB : public IObserver
{
public:
observerB() {}
~observerB() {}
public:
virtual void update() {
cout << "我是观察者B, 我观察到..." << endl;
}
};
void test_observed(){
concreteSubject* subject = new concreteSubject();
observerA* oA = new observerA();
observerB* oB = new observerB();
cout << "--------------------添加A观察者-----------------------------------" << endl;
subject->attach(oA);
subject->doSomething();
cout << "--------------------添加B观察者-----------------------------------" << endl;
subject->attach(oB);
subject->doSomething();
cout << "--------------------删除A观察者-----------------------------------" << endl;
subject->detach(oA);
subject->doSomething();
cout << "--------------------删除B观察者-----------------------------------" << endl;
subject->detach(oB);
subject->doSomething();
delete subject;
delete oA;
delete oB;
}