设计模式-观察者模式

观察者模式是一种一对多的依赖关系模式,当主题对象状态变化时,所有观察者都会被通知并自动更新。常用于对象状态改变需要同步更新到多个地方的场景,如公司秘书或老板通知员工开会的例子。该模式抽象出观察者和通知者角色,实现灵活的通知机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式,又叫发布-订阅(Publish/Subscribe)模式:定义了一种一对多的依赖关系,让多个观察对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知多个观察者对象,使他们能自动更新自己。

观察者模式一般用在:当一个对象的改变同时需要改变其他对象,而且它不知道具体有多少对象待改变时。
例子:公司通过秘书通知部分员工开会,秘书状态改变,员工将收到通知。当然老板也可以通知开会,所以就抽象出观察者类和通知者类
UML:
这里写图片描述

class Notifier;
//抽象观察者
class Observer {
public:
    Observer(string name, Notifier *notifer) :m_name(name), m_notifer(notifer) {}
    virtual void Updata() = 0;
protected:
    string m_name;                                         //观察者名称
    Notifier *m_notifer;                                  //观察者接受消息的通知者
};
//通知者
class Notifier {
public:
    virtual void Attach(Observer *observer)   //增加观察者
    {
        m_obersvers.push_back(observer);
    }
    virtual void Detach(Observer *observer)  //减少观察者
    {
        m_obersvers.remove(observer);
    }
    virtual void Notify()                                   //发布通知
    {
        for (auto ob : m_obersvers)
        {
            ob->Updata();                                     //对每个观察者调用其更新函数
        }
    }
    virtual void SetStatus(string status)
    {
        m_status = status;
    }
    virtual string GetStatus() 
    {
        return m_status;
    }
private:
    list<Observer*> m_obersvers;                    //观察者列表
protected:
    string m_status;
};
//员工,具体观察者
class Staff :public Observer {
public:
    Staff(string name, Notifier *notifer) :Observer(name, notifer) {}
    void Updata()                                               //获得更新状态
    {
        string status = m_notifer->GetStatus();
        cout << m_name << " 收到: " << status << endl;
    }
};
//秘书,具体通知者
class Secretary :public Notifier{
public:
    Secretary(string name) :m_name(name) {}
    void SetStatus(string status)
    {
        m_status =  m_name + "代表公司通知" + status;
    }
    string GetStatus()
    {
        return m_status;
    }
private:
    string m_name;
};

int main()
{
    Notifier *secretary = new Secretary("秘书");
    Staff *staff1 = new Staff("小张",secretary);
    Staff *staff2 = new Staff("小余", secretary);
    secretary->Attach(staff1);
    secretary->Attach(staff2);
    secretary->SetStatus("今天下午开会");
    secretary->Notify();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值