C++观察者模式

观察者模式:
    定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有的
观察者对象,使他们能够自动更新自己。
UML图:

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。两个对象之间松耦合,但是依然交互,不太清楚对方的具体细节。
就是不会像前面的策略模式一样,一个类对象中包含了另外一个对象。
对于观察者的一切,主题(Subject)只知道观察者实现了某个接口。主题不需要知道观察者的具体类是谁、做了些什么或者其它的细节。
主题类中仅包含了观察者的列表,可以对观察者进行添加或者删除。
其实好的C++代码:都是为了交互对象之间的松耦合设计而努力。

C++ 实现:
subject.h
  1. #ifndef SUBJECT_H
  2. #define SUBJECT_H
  3. #include<list>
  4. classObserver;
  5. classSubject{
  6. protected:
  7. std::list<Observer*> observers;
  8. public:
  9. virtualvoid registerObserver(Observer*observer);
  10. virtualvoid removeObserver(Observer*observer);
  11. virtualvoid notify(){}
  12. };
  13. classWeatherDate:publicSubject{
  14. private:
  15. int temperature;
  16. int pressure;
  17. int humidity;
  18. public:
  19. WeatherDate(){
  20. temperature=0;
  21. pressure=0;
  22. humidity=0;
  23. }
  24. void setWeather(int,int,int);
  25. virtualvoid notify();
  26. };
  27. #endif
subject.cpp
  1. #include"subject.h"
  2. #include"observer.h"
  3. classObserver;
  4. voidSubject::registerObserver(Observer*observer){
  5. observers.push_back(observer);
  6. }
  7. voidSubject::removeObserver(Observer*observer){
  8. std::list<Observer*>::iterator iter=observers.begin();
  9. for(;iter!=observers.end();iter++){
  10. if(*iter==observer){
  11. observers.erase(iter);
  12. break;
  13. }
  14. }
  15. }
  16. voidWeatherDate::notify(){
  17. std::list<Observer*>::iterator iter=observers.begin();
  18. for(;iter!=observers.end();iter++){
  19. (*iter)->update(temperature,pressure,humidity);
  20. }
  21. }
  22. voidWeatherDate::setWeather(int _temperature,int _pressure,int _humidity ){
  23. temperature=_temperature;
  24. pressure=_pressure;
  25. humidity=_humidity;
  26. }
observer.h
  1. #ifndef OBSERVER_H
  2. #define OBSERVER_H
  3. classSubject;
  4. classObserver{
  5. private:
  6. Subject* subject;
  7. public:
  8. virtualvoid update(int,int,int);
  9. virtualvoid unregister();
  10. Observer(Subject*subj);
  11. };
  12. #endif
observer.cpp
  1. #include"observer.h"
  2. #include"subject.h"
  3. #include<iostream>
  4. classSubject;
  5. voidObserver::update(int temperature,int pressure,int humidity ){
  6. std::cout<<"temperature: "<<temperature<<std::endl;
  7. std::cout<<"pressure: "<<pressure<<std::endl;
  8. std::cout<<"humidity: "<<humidity<<std::endl;
  9. }
  10. Observer::Observer(Subject*subj){
  11. this->subject=subj;
  12. subject->registerObserver(this);
  13. }
  14. voidObserver::unregister(){
  15. subject->removeObserver(this);
  16. }
main.cpp
  1. #include"subject.h"
  2. #include"observer.h"
  3. int main(){
  4. WeatherDate data;
  5. data.setWeather(30,100,200);
  6. Observer obser(&data);
  7. data.notify();
  8. }
上面的代码就是实现一个气象站的功能。
气象站当然有很多的观察者,当气温或者湿者之类的有变动,就需要通知对应的观察者。
 
 



附件列表

原文地址:https://www.cnblogs.com/yml435/p/6945925.html