设计模式-观察者模式

设计模式-观察者模式,第1张

        观察者模式的应用遍布在我们的生活中,比如在class="superseo">csdn中,当你关注的博主发布新的文章的时候,他的所有粉丝都会收到相关的通知,作为粉丝的你看到这个通知之后,可能会忽略也可能会点进去相关链接查看。因此,以CSDN博主与粉丝之间的关系为例,介绍并使用C++实现这个常用的观察者与消费者模式(发布-订阅模式),为了后续描述方便,使用发布者与订阅者模式代替观察者模式。这其中主要涉及到四个类别:抽象发布者类,具体发布者类,抽象订阅者类以及具体订阅者类。

1. 抽象发布者类以及抽象订阅者类

        其中,Fans类表示订阅者类的抽象类,而Blogger表示发布者的抽象类。当发布者发布博客的时候,就会通知Fans类,Fans类就会更新它们各自的信息。

class Fans{
public:
    string status;
    virtual void update(const string&) = 0;
    virtual void show() = 0;
};

class Blogger{
protected:
    list fans_lst;
public:
    Blogger(){};
    virtual ~Blogger(){};
    virtual void attach(Fans* fans){
        fans_lst.push_back(fans);
    }
    virtual void detach(Fans* fans){
        fans_lst.remove(fans);
    }
    virtual void notify() = 0;
};

        为了能够让发布者状态更新的时候,每个订阅者都能够得到状态更新的消息,就需要在发布者中设置一个list属性,list就像是一个电话通讯录,每当发布者状态更新时,它就会挨个挨个打电话通知订阅者。

2. 具体订阅者类

        在具体订阅者类中,移动实例化了两个订阅者。

class FansZhang:public Fans{
private:
    string id;
public:
    FansZhang():id("zhangSan"){};
    FansZhang(string name):id(name){};
    ~FansZhang(){};
    void update(const string& info){
        status = info;
    };
    void show(){
        cout << "["<< id << "] >> 接收到的消息是: "<< status << endl;
    }
};

class FansLiu:public Fans{
private:
    string id;
public:
    FansLiu():id("Liu"){};
    FansLiu(string name):id(name){};
    ~FansLiu(){};
    void update(const string& info){
        status = info;
    };
    void show(){
        cout << "["<< id << "] >> 接收到的消息是: "<< status << endl;
    }   
};
3. 具体发布者类

        在具体发布者类中,由于notify()函数中需要使用每个发布者的名字,因此就将notify()函数放在实例中进行显示了。

class OreoBlogger:public Blogger{
private:
    string name;
public:
    OreoBlogger(){};
    OreoBlogger(string name):name(name){};
    ~OreoBlogger(){};
    void notify(){
        for(list::iterator it = fans_lst.begin(); it != fans_lst.end(); ++it){
            const string info = name +"更新博客了"; 
            (*it)->update(info);
        };
    }
};
4. 主函数测试效果

        下面就是测试代码:

int main(){
    Fans* zhang = new FansZhang();
    Fans* liu = new FansLiu();
    Blogger* oreo = new OreoBlogger("oreo");
    oreo->attach(zhang);
    oreo->attach(liu);
    // oreo博主更新了博客
    oreo->notify();
    // zhang打印消息,liu打印消息
    zhang->show();
    liu->show();
    return 0;
}

        下面就是测试结果:

5. 参考文献

(1) 设计模式C++实现(15)——观察者模式_wuzhekai1985的博客-CSDN博客_c++观察者模式

(2) 史上最全设计模式导学目录(完整版)_LoveLion的博客-CSDN博客

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/788206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存