14 大话设计模式C++实现之观察者模式

本文介绍了观察者模式,一种用于建立一对多依赖关系的设计模式。通过实例展示了如何使用C++实现观察者模式,员工监听老板和前台的通知,以便在状态改变时做出相应的行为调整。
摘要由CSDN通过智能技术生成

/*
观察者模式(又叫发布-订阅模式)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态发生变化时会通知所有的观察者对象
*/

/*
例子:有员工在上班时间看电影、NBA、股票等与工作无关的内容,前台可以给员工发送通知,因此所有的员工通过监听受监测对象即可对自身的工作做出调整
同样的,老板也需要通知一些业务内容,因此例子主要让在干不同事的员工监听前台类和老板类(继承与subject类),其中subject类维持一个员工对象列表用对于所有员工发出通知
*/

#include<iostream>
#include<string>
#include<list>

using namespace std;

class Observer
{

public:
    virtual void Update() = 0;
};


class Subject
{
public:
    virtual void Attach(Observer* observer) = 0;  //增加和删除员工
    virtual void Detach(Observer* observer) = 0;
    virtual void Notify() = 0;
    virtual string Get() = 0;    //获取和设置状态
    virtual void Set(const string &s) = 0;
};

class Boss : public Subject
{
private:
    //维持一个同事列表
    list<Observer*> observers{};
protected:
    string action;
public:
    virtual void Attach(Observer* observer)  //增加和删除员工
    {
        observers.push_back(observer);
    }
    virtual void Detach(Observer* observer)
    {
        observers.remove(observer);
    }
    virtual void Notify()
    {
        for (auto o : observers)
        {
            o->Update();
        }
    }
    virtual string Get()    //获取和设置状态
    {
        return this->action;
    }
    virtual void Set(const string& s)
    {
        this->action = s;
    }
};

class Xgg : public Subject
{
private:
    //维持一个同事列表
    list<Observer*> observers;
protected:
    string action;
public:
    virtual void Attach(Observer* observer)  //增加和删除员工
    {
        observers.push_back(observer);
    }
    virtual void Detach(Observer* observer)
    {
        observers.remove(observer);
    }
    virtual void Notify()
    {
        for (auto o : observers)
        {
            o->Update();
        }
    }
    virtual string Get()    //获取和设置状态
    {
        return this->action;
    }
    virtual void Set(const string& s)
    {
        this->action = s;
    }
};


class StockObserver : public Observer
{
protected:
    string name;
    Subject *sub;
public:
    StockObserver(string name, Subject *sub)
    {
        this->name = name;
        this->sub = sub;
    }
public:
    virtual void Update()
    {
        cout << this->sub->Get() << this->name << "关闭股票行情快工作!" << endl;
    }
};

class NBAObserver : public Observer
{
protected:
    string name;
    Subject *sub;
public:
    NBAObserver(string name, Subject *sub)
    {
        this->name = name;
        this->sub = sub;
    }
public:
    virtual void Update()
    {
        cout << this->sub->Get() << this->name << "关闭NBA快工作!" << endl;
    }
};

void Client()
{
    Boss *huhansan = new Boss();
    StockObserver *tongshi1 = new StockObserver("魏冠茶", huhansan);
    NBAObserver * tongshi2 = new NBAObserver("科比", huhansan);

    huhansan->Attach(tongshi1);
    huhansan->Attach(tongshi2);

    huhansan->Set("我胡汉三又回来了");
    huhansan->Notify();

    huhansan->Detach(tongshi1);
    huhansan->Set("下午汇报工作!");
    huhansan->Notify();
}

int main()
{
    Client();
    system("pause");
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值