• 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. }
    上面的代码就是实现一个气象站的功能。
    气象站当然有很多的观察者,当气温或者湿者之类的有变动,就需要通知对应的观察者。
     
     



    附件列表

  • 相关阅读:
    CF869E The Untended Antiquity 解题报告
    Walk 解题报告
    CF911F Tree Destruction 解题报告
    P4397 [JLOI2014]聪明的燕姿
    洛谷 P2329 [SCOI2005]栅栏 解题报告
    洛谷 P3747 [六省联考2017]相逢是问候 解题报告
    set-erase
    set-empty
    set-empty
    set-end
  • 原文地址:https://www.cnblogs.com/yml435/p/6945925.html
Copyright © 2020-2023  润新知