C++设计模式 —— 2.observer 观察者模式

 下面的代码实现了一个observer模式,添加observer以后可以很方便的跟踪变量的改变

/*
    obs.hpp
    实现observer类
    抽象出一个接口
*/
#include<list>

class observer{
public:
    //观察者接口,我们只用定义一个我们想要用户实现的虚函数
    //在实现了下面的publisher以后,只需要继承observer类并且重写update函数就可以实现observer模式
    //这样就可以在不同平台上实现不同的update接口
    virtual void update(int val)=0;
    virtual ~observer(){}
};  

class publisher{ //发布者,需要添加不同的observer进去,在pubisher更新,即可实现所有observer的更新
public:
    std::list<observer*> users;  //保存不同的观察者,可能有100个
    void add(observer* ptr){     //添加新的观察者
        users.push_front(ptr);
    }
    void remove(observer* ptr){
        //删除逻辑...我就不实现了
    }
    void update(int val){
        auto it=users.begin();
        for(;it!=users.end();it++){
            (*it)->update(val);     //当我们调用update时,我们依次唤醒所有observer,发送值
        }
    }
    ~publisher(){
    }
};
/*
    观察者模式 main.cpp
    Observer / Event
    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知 并 被自动更新。
    最典型的一个例子就是:
        如何监听一个值的变化?
        比如现在有一个进度条,我需要在进度改变的时候更新进度条,我该如何设计这个observer类?

*/
#include<iostream>
#include"obs.hpp"
using namespace std;
//我们为了实现不同的观察者,我们编写两个类,继承自 observer,一个在控制台上打. 一个自己的数值+1
class coutPoint : public observer{
public:
    virtual void update(int val){
        //实现这个更新的接口:在控制台上打点
        for(int i=0;i<val;i++){
            cout<<'.';
        }
        cout<<endl;
    }
};
//再实现一个观察者,当值更新时,我们内部的某个成员变量+1
class numberPlus : public observer{
public:
    int num=0;
    virtual void update(int val){
        num++;
    }
};
int main(){
    publisher pub;  //publisher类,他连接所有观察者
    coutPoint cp;   //在值变动时,在屏幕上打印.的类
    numberPlus np;  //在值变动时,自己内部成员变量+1的类
    pub.add(&cp);   
    pub.add(&np);   //添加观察者进去
    for(int i=0;i<77;i++){
        pub.update(i);  //更新值
    }
    cout<<np.num<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值