观察者模式
1、观察者模式简介
观察者模式也叫发布-订阅模式、模型-视图模式、源-监听器模式以及从属者模式,观察者模式定义了对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
2、实例讲解
假如张三、李四、王五三人都订阅了环球日报的报纸。那么当环球日报的报纸有更新的时候就会送到他们三人手中。
//报纸接口类
class NewsPaperBase
{
public:
//添加订阅者
virtual void RegisterSubscriber(ISubScribe* f_subScribe) = 0;
//取消订阅
virtual void RemoveSubScriber(ISubScribe* f_subScribe) = 0;
//发送报纸
virtual void SendPaper() = 0;
virtual ~NewsPaperBase(){}
};
//订阅者接口类
class SubScribeBase
{
public:
//有新的报纸了就会被执行通知
virtual void HasNewPaper() = 0;
virtual string GetName();
virtual ~SubScribeBase(){}
};
//具体实现是哪种报纸
class GlobalDaily :
public NewsPaperBase
{
public:
GlobalDaily();
virtual ~GlobalDaily();
//重写基类方法
void RegisterSubscriber(SubScribeBase* f_subScribe)
{
subs.add(f_subScribe);//伪代码
cout << f_subScribe->GetName().c_str()<<"完成订阅" << endl;
}
void RemoveSubScriber(SubScribeBase* f_subScribe)
{
subs.remove(f_subScribe);//伪代码
cout << f_subScribe->GetName().c_str()<<"取消订阅" << endl;
}
void SendPaper()
{
for(auto v:subs)
{
v->HasNewPaper();
}
}
private:
//关联订阅者
vector<SubScribeBase*> subs;
};
//具体的订阅者实现
class SubPeople :
public SubScribeBase
{
public:
SubPeople(std::string name):m_name(name){};
~SubPeople();
void HasNewPaper()
{
std::cout << m_name << "收到报纸" << endl;
}
string GetName()
{
return m_name;
}
private:
std::string m_name;
};
//调用步骤
int main()
{
NewsPaperBase* pGlobalPaper = new GlobalDaily();
SubScribeBase* sub = new SubPeople("张三");
pGlobalPaper->RegisterSubscriber(sub);
sub = new SubPeople("李四");
pGlobalPaper->RegisterSubscriber(sub);
sub = new SubPeople("王五");
pGlobalPaper->RegisterSubscriber(sub);
pGlobalPaper->SendPaper();
return 0;
}