观察者模式 c++

观察者模式
定义:也叫发布订阅模式,定义对象间一对多的依赖关系,使得每当一个对象改变(被观察者(韩非子)),则所有依赖于它的对象(观察者)都会得到通知并被自动更新。

通用类图:
这里写图片描述

Subject被观察者
定义被观察者必须实现的职责,它必须能够动态的增加,取消观察者。它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
Observer观察者
观察者接收到消息后,即update操作,对接收到的信息进行处理。
ConcreteSubject具体的被观察者
定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
ConcreteObserver具体的观察者
每个观察者在接收到消息后的处理反应是不同的,各个观察者有自己的处理逻辑。

模式优点:观察者与被观察者之间是抽象耦合,如此设计,不管增加谁都是非常容易的。
建立一套触发机制。
模式缺点:一个被观察者,多个观察者调试比较困难。(一般采用异步的方式)

使用场景:关联行为场景;事件多级触发;跨系统的消息交换场景;

具体场景:
文件系统:例如在一个目录下建立一个文件,这个动作同时通知目录管理器增加该目录,并通知磁盘管理器减少1KB空间.文件时被观察者,其他俩是观察者。
ATM机:比如你在ATM上取钱,多次输错密码,卡就会被ATM吞掉,这时,会触发哪些事件呢?1,摄像头连拍;2,通知监控系统;3,初始化ATM;一般前两个动作是观察者模式来完成的,后一个动作是异常来完成的。

题示:
李斯,等人监控韩非子
类图:
这里写图片描述

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//观察者接口
class Observer
{
    public:
    virtual void update(string context)  = 0;

};
//具体观察者
class LiSi:public Observer
{
public:
    void update(string str)
    {
        cout<<"观察到韩非子开始活动"<<endl;
        this->reportToQiShiHuang(str);
        cout<<"汇报完毕"<<endl;
    }

    void reportToQiShiHuang(string reportContext)
    {
        cout<<"韩非子有活动了:   "<<reportContext<<endl;
    }
};
class WangSi:public Observer
{
public:
    void update(string str)
    {
        cout<<"观察到韩非子开始活动"<<endl;
        this->reportToQiShiHuang(str);
        cout<<"汇报完毕"<<endl;
    }

    void reportToQiShiHuang(string reportContext)
    {
        cout<<"韩非子有活动了:   "<<reportContext<<endl;
    }
};

//被观察者接口
class IHanFeiZi
{
public:
    virtual void haveBreakfast() = 0 ;
    virtual void haveFun()= 0 ;
};
//被观察者接口
class Observable
{
    public:
    virtual void addObserver(Observer *observer) = 0;//增加观察者
    virtual void deleteObserver(Observer *observer) = 0 ;//删除观察者
    virtual void notifyObserver(string context) = 0 ; //发生改变他应该有所动作通知观察者
};
//被观察者实现类
class HanFeiZi : public Observable,IHanFeiZi
{
    private:
    //定义一个变长数组,存放所有观察者
    vector<Observer*>observerList;
    public:
        void addObserver(Observer *observer)
        {
            this->observerList.push_back(observer);
        }
        void deleteObserver(Observer *observer)
        {
            vector<Observer*>::iterator key = find(observerList.begin(),observerList.end(),observer);
              /*for(; key != observerList.end() ; key++)
              {
                  Observer * keyPtr = *key;
                  if(*keyPtr == *observer)
                        break;
              }*/
              observerList.erase(key);
        }
        void notifyObserver(string context)
        {
            for(auto key : observerList)
                key->update(context);
        }

        void haveBreakfast()
        {
            cout<<"韩非子吃饭了"<<endl;
            //通知所有观察者
            this->notifyObserver("韩非子在吃饭");
        }
          void haveFun()
        {
            cout<<"韩非子在娱乐"<<endl;
            //通知所有观察者
            this->notifyObserver("韩非子在娱乐");
        }
};

int main()
{
    Observer *liSi = new LiSi();
    Observer *wangSi = new WangSi();

    HanFeiZi hanfeizi;

    hanfeizi.addObserver(liSi);
    hanfeizi.addObserver(wangSi);

    hanfeizi.haveBreakfast();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值