/*
观察者模式学习笔记
*/
#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]封装变化