设计模式学习之观察者模式

71 阅读1分钟
/*

观察者模式学习笔记

*/

#include <iostream>
#include <list>

class Observer{

public:
    virtual void update() = 0;

};

class Subject{
public:
    //注册观察者
    virtual void registerObserver(Observer * observer) = 0;

    //移除观察者
    virtual void removeObserver(Observer * observer) = 0;
    
    //通知观察者
    virtual void notiftObserver() = 0;

};

class Date : public Subject{
public:
    void registerObserver(Observer * observer){
    observers.push_back(observer);
}

void removeObserver(Observer * observer){
    observers.remove(observer);
}

void notiftObserver(){
    for(auto observer : observers){
        observer->update();
    }
}

std::string getDateStr(){
    return dateStr;
}

  
void setDateStr(std::string dateStr){
    this->dateStr = dateStr;
    notiftObserver();
}

private:
    int data;
    std::list<Observer*> observers;
    std::string dateStr;
};

  


class ObserverDate : public Observer{

public:
    ObserverDate(Subject * subject): subject(subject){
    subject->registerObserver(this);
}

void update(){
    std::cout << dynamic_cast<Date*>(subject)->getDateStr() << std::endl;
}

private:
    Subject * subject;
};

  


int main(int argc,char * argv[]){
    Date date;
    ObserverDate observerDate(&date);
    date.setDateStr("2024-10-27");
    date.setDateStr("2024-10-28");
    return 0;
}

使用观察者模式的优点:

  • 有助于松耦合,主题不必知道观察者的过多细节,只需要知道在数据发生变化的时候调用观察者的update()函数进行更新即可。

从观察者模式中我们能学到什么?

  • 抽象,将主题和订阅者的接口进行抽象,主题和订阅只需要按照规范去实现Subject和Observer就可以很好进行松藕,不需要知道对方的过多细节。
  • 面向对象原则:[1]面向接口编程而不是针对实现编程。[2]封装变化