版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30042269/article/details/83348971
日常学习C++设计模式中...
给自己留个备份,有问题欢迎沟通交流。
好了,开始喽~
-------------------------------------------------------------------------------------------------------------------
需求
当某对象状态改变时,需要通知多个对象进行更新,即一对多依赖关系。
例如:某家公司的旅游基金涨了,每个人都涨了500!!,那么员工需要重新计算获得的旅游基金总额,重新安排自己的旅游规划,那么这些员工就是观察者,公司将涨500通知到每个员工,员工各自处理。【举得不知道合不合适。。】
分析
多个对象,即观察者,对某对象的状态进行监听。
源码:
//main.h
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <list>
#include <string>
#include <algorithm>
class IObserver;
/////////////create ABC /////////////////
class IManager{
public:
IManager(){}
virtual void registerObservers(IObserver* obv) = 0;
virtual void unRegisterObservers(IObserver* obv) = 0;
//callback data to Observers
virtual void callbackData(std::string data) = 0;
};
class IObserver{
public:
IObserver(){}
//recive data from Manager
virtual void updateData(std::string data) = 0;
};
////////create IManager son class/////////
class Manager: public IManager
{
public:
virtual void registerObservers(IObserver* obv);
virtual void unRegisterObservers(IObserver* obv);
virtual void callbackData(std::string data);
private:
std::list<IObserver* > m_registerObvList;
};
////////create Observers////////////
class Observer_1 :public IObserver
{
public:
Observer_1(std::string id){m_id = id;}
//recive data from Manager
virtual void updateData(std::string data);
private:
std::string m_id;
};
class Observer_2:public IObserver
{
public:
Observer_2(std::string id){m_id = id;}
//recive data from Manager
virtual void updateData(std::string data);
private:
std::string m_id;
};
#endif // MAIN_H
//main.cpp
#include "main.h"
//////////观察者模式////////////
void Manager::registerObservers(IObserver* obv)
{
if(NULL != obv)
{
m_registerObvList.push_back(obv);
}
}
void Manager::unRegisterObservers(IObserver* obv)
{
std::list<IObserver*>::iterator iter;
iter = std::find(m_registerObvList.begin(),m_registerObvList.end(),obv);
if(m_registerObvList.end() != iter)
{
m_registerObvList.erase(iter);
}
}
void Manager::callbackData(std::string data)
{
std::list<IObserver*>::iterator iter;
for(iter = m_registerObvList.begin(); iter != m_registerObvList.end(); ++iter)
{
(*iter)->updateData(data); //pass data to all observers
}
}
void Observer_1::updateData(std::string data)
{
printf("----->[Observer_1]updateData data:%s\n",data.c_str());
}
void Observer_2::updateData(std::string data)
{
printf("----->[Observer_2]updateData data:%s\n",data.c_str());
}
int main(int argc, char *argv[])
{
printf("========hello======\n");
//创建Manager
IManager* manager = new Manager();
//创建观察者1号,2号
IObserver* obv1 = new Observer_1("A");
IObserver* obv2 = new Observer_1("B");
//注册
manager->registerObservers(obv1);
manager->registerObservers(obv2);
printf("-------start callback data--------\n");
//向已注册的所有观察者传递数据
manager->callbackData("Hello Wantong!");
return 0;
}
输出结果
========hello======
-------start callback data--------
----->[Observer_1]updateData data:Hello Wantong!
----->[Observer_1]updateData data:Hello Wantong!
总结
从输出结果可以看出,两个观察者均收到了来自IManager的数据,并分别打印。
使用时,当然可以每个观察者对象收到数据时,可以进行完全不同的操作,不限制于打印log。
感谢网上各路大神的分享。