设计模式----观察者模式 【含实例】

日常学习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。

 

感谢网上各路大神的分享。

学习参考 https://me.csdn.net/u011012932

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值