c++设计模式之-观察者模式

观察者模式

1)目标类(被观察者)
2)观察者类

3)具体的目标
4)具体的观察者

这四个类之间的关系是怎样的呢?

观察者模式的UML类图[1]
1)被观察的类
我们可以看到抽象的被观察者类中有三个public的成员函数,这个类图画的不大对,应该还要有一个list<Observer*>的数据成员,用来保存观察者;
这三个成员函数从函数名字就知道其作用,添加观察者,删除观察者,通知观察者。
这几个函数在抽象的被观察者类中应该都是纯虚函数

2)观察者类
只有一个public的update函数,可以加一个被观察者类的指针作为数据成员,当被观察者发生改变时,会调用update更新自己观察到的状态。

3)具体的被观察者,继承了抽象的被观察者类,作为子类实现父类的纯虚函数。

4)具体的观察者,继承了抽象的观察者类

#include <iostream>
#include<vector>
#include<list>
#include<algorithm>
#include <climits>
#include<unordered_map>
using namespace std;

class Subject;

class Observer{//观察者的抽象类
    public:
    virtual void update()=0;
    
};

class Subject{//被观察者的抽象类
    public:
    virtual void attach(Observer*)=0;
    virtual void disattach(Observer*)=0;
    virtual void Notify()=0;
    inline int   getindex()  {
       return index;
      }
    protected:
    list<Observer*> observer_list;
    int index;
};

class  Weather:public Subject{//被观察的具体类,天气类

    static unordered_map<int,string> m_wea;
   public:
   void attach(Observer*pm) override{
       
       observer_list.push_back(pm);
   }
   void disattach(Observer*pm) override{
       observer_list.remove(pm);
   }
   void Notify() override{
       for(auto pm:observer_list)
            pm->update();
   }
   void setWeather(int i){
       index=i;
   }
   
   
  
};
unordered_map<int,string> Weather::m_wea={{1,"rain"},{2,"sunny"}};
class People:public Observer{
    public:
    People(Subject*ps,string name):m_ps(ps),m_name(name){}
    void update() override{
        cout<<m_name<< "看到的天气是:   "<<m_ps->getindex()<<endl;
    }
    private:
    Subject *m_ps;
    string m_name;
};


int main(){
    
    Weather*p=new Weather();
    
    
    People *pp=new People(p,"小米");
    int a=111;
    p->attach(pp);//相当于Qt中的connect()函数
    p->setWeather(a);
    p->Notify();
    a=99;
    p->setWeather(a);
    p->Notify();
    delete p;
    delete pp;
}

输出

参考博客:
[1] https://blog.csdn.net/leonardohaig/article/details/120187956

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值