设计模式-观察者模式

/*观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变,依赖它的多个对象都要得到通知并自动更新*/

#include <iostream>
#include <memory>
#include <list>
#include <algorithm>

using namespace std;

class Observer {    //观察者基类
public:
    virtual ~Observer(){};    //基类的析构函数写成虚的,使delete实际指向子类的基类指针时,能先调子类的析构函数,再调基类的。
    virtual void update() = 0;
};

class Observed {  //被观察者基类
public: 
    virtual ~Observed(){}     
    virtual void addObserver(Observer* obs) = 0;
    virtual void removeObserver(Observer* obs) = 0;
    virtual void notifyObserver() = 0;
};

class DataObserved : public Observed {
public:
     ~DataObserved()
     {
        observers.clear();
     }
     
     void addObserver(shared_ptr<Observer> obsPtr) override
     {
        if(find(observers.begin(),observers.end(), obsPtr) == observers.end()){
            observers.push_back(obsPtr);
        }

     }
     
     void removeObserver(shared_ptr<Observer> obsPtr) override
     {
        for(auto i = observers.begin();i != observers.end();i++){
            if((*i) == obsPtr){
                observers.erase(i);     //容器里存放的智能指针erase后,use_count减1变为0,智能指针指向的堆内存会自动delete
                return;
            }
        }
     }
     
     void notifyObserver() override
     {
        for(auto i = observers.begin();i != observers.end();i++){
            (*i)->update();
        }
     }
private:
    vector<shared_ptr<Observer>> observers;    //存放观察者对象,当被观察者自身发生改变时通知容器内所有的观察者对象自动更新
};

class TableObserver : public Observer
 {
public:
    ~TableObserver(){cout<<"~~table"<<endl;}
    void update() override
    {
        cout<<"Table update with data."<<endl;
    }
};

class ChartObserver : public Observer 
{
public:
    ~ChartObserver(){cout<<"~~chart"<<endl;}
    void update() override
    {
        cout<<"Chart update with data."<<endl;
    }
};

int main()
{
	shared_ptr<DataObserved> data = make_shared<DataObserved>();
	shared_ptr<Observer> table = make_shared<Observer>();
	shared_ptr<Observer> chart = make_shared<Observer>();

    data->addObserver(table);
    data->addObserver(chart);

    data->notifyObserver();
    
    data->removeObserver(table);
    
    data->notifyObserver();
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值