现实需求:许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。
观察者模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点 :
缺点:
主要角色:
具体案例:
小码路上班划水的时候还是有的,身边的伙伴累了大家一起划水嘛,有的伙伴在刷斗音,有的在逛淘宝,但是划水的滋味也不好受啊,时刻要盯着老板是不是要来了。于是,大家想到一个办法,让小码路一个人时刻盯着老板,老板要是来了,及时告诉大家停止划水,继续工作哦哦哦。(当然,内容纯属虚构,小码路和伙伴上班还是很认真的哦)
第一步:抽象主题
#pragma once
#include <iostream>
using namespace std;
#include <list>
class BossListenner;
//通知者的行为抽象为一个接口
class Notifier
{
public:
virtual void registerListenner(BossListenner *boss)=0;
virtual void removeListenner(BossListenner *boss)=0;
virtual void notify()=0;
};
第二步:具体主题通知者
//小码路作为通知者
class XmlNotifier:public Notifier
{
public:
void registerListenner(BossListenner *boss)
{
listenners.push_back(boss);
}
void removeListenner(BossListenner *boss)
{
list<BossListenner*>::iterator it;
for(it=listenners.begin();it!=listenners.end();it++)
{
if(*it==boss)
{
listenners.remove(boss);
break;
}
}
}
void notify();//BossComing实现在其后面,这样会报错,把它拿到最后去实现
// {
// list<BossListenner*>::iterator it;
// for(it=listenners.begin();it!=listenners.end();it++)
// {
// (*it)->BossComing(mValue);
// }
// }
void setValue(int value);
// {
// mValue=value;
// notify();
// }
private:
list<BossListenner*> listenners;
int mValue;
};
第三步:抽象监听者
//定义一个老板来了的监听者
class BossListenner
{
public:
virtual void BossComing(int value)=0;
};
第四步:具体监听者
//具体划水的监听了老板来了这个接口
class SdyPeople:public BossListenner
{
public:
void BossComing(int value)
{
stopXdy(value);
}
void stopXdy(int value)
{
cout<<"划水的伙伴停止刷斗音+1,继续工作!"<<value<<endl;
}
};
class GtbPeople:public BossListenner
{
public:
void BossComing(int value)
{
stopGtb(value);
}
void stopGtb(int value)
{
cout<<"划水的伙伴停止逛淘宝+1,继续工作!"<<value<<endl;
}
};
void XmlNotifier::notify()
{
list<BossListenner*>::iterator it;
for(it=listenners.begin();it!=listenners.end();it++)
{
(*it)->BossComing(mValue);
}
}
void XmlNotifier::setValue(int value)
{
mValue=value;
XmlNotifier::notify();
}
第五步:主函数
#include "g.h"
int main()
{
cout<<"老板来了"<<endl;
XmlNotifier xml;
SdyPeople xdy;
GtbPeople gtb;
xml.registerListenner(&xdy);
xml.registerListenner(>b);
xml.setValue(1);
cout<<"老板又来了"<<endl;
xml.removeListenner(>b);
xml.setValue(2);
}
显示: