• 观察者模式【C++版】


    一、定义观察者类

       a)观察者基类

    enum ObservedStatus {Dining, Sleeping, Working};
    /*******************************定义多个观察者类*************************************/

    //定义观察者的父类(抽象类,实际作用相当于java中的接口)
    class Observer
    {
    public:
    virtual void update(ObservedStatus status)=0;
    virtual ~Observer() {}//保证父类指针指向子类时,delete基类指针,子类的析构行为能正确调用
    };

       b)具体观察者类

    class DiningObserver: public Observer
    {
    void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
    {
    if (status == Dining) {
    cout
    <<"我是观察者DiningObserver,当前被观察者的状态为:Dining!"<<endl;
    }
    else{
    cout
    <<"我是观察者DiningObserver,但状态不匹配"<<endl;
    }
    }
    };


    class SleepingObserver: public Observer
    {
    void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
    {
    if (status == Sleeping) {
    cout
    <<"我是观察者SleepingObserver,当前被观察者的状态为:Sleeping!"<<endl;
    }
    else{
    cout
    <<"我是观察者SleepingObserver,但状态不匹配"<<endl;
    }
    }
    };


    class WorkingObserver: public Observer
    {
    void update(ObservedStatus status)//只需要实现观察者父类中update虚函数
    {
    if (status == Working) {
    cout
    <<"我是观察者WorkingObserver,当前被观察者的状态为:Working!"<<endl;
    }
    else{
    cout
    <<"我是观察者WorkingObserver,但状态不匹配"<<endl;
    }
    }
    };

    二、定义被观察者类

     a)被观察者基类

    /*******************************定义被观察者类*************************************/

    class ObservedBase//被观察者基类
    {
    public:
    virtual void addObserver(Observer *observer)=0;//添加观察者
    virtual void removeObserver(Observer *observer)=0;//删除观察者
    virtual void notifyToObservers()=0;//将自身信息通知观察者
    };

     b)实际被观察者类

    class Observed:public ObservedBase
    {
    public:

    Observed(ObservedStatus _status)
    //构造函数
    {
    status
    =_status;
    }

    void addObserver(Observer *observer)//添加某个观察者
    {
    observersList.push_back(observer);
    }

    void removeObserver(Observer *observer)//移除某个观察者
    {
    observersList.remove(observer);
    }

    void notifyToObservers()//通知所有观察者
    {
    for (list<Observer*>::iterator it = observersList.begin();
    it
    != observersList.end(); ++it)
    {
    Observer
    * theObserver = *it;
    theObserver
    ->update(status);
    }
    }
    private:
    list
    <Observer*> observersList;
    ObservedStatus status;
    };

    三、主函数调用

    int main()
    {
    cout
    <<"测试程序:"<<endl;
    Observer
    *FirstObserver=new DiningObserver();
    Observer
    *SecondObserver=new SleepingObserver();
    Observer
    *ThirdObserver=new WorkingObserver();

    Observed
    *myObserved=new Observed(Working);
    myObserved
    ->addObserver(FirstObserver);
    myObserved
    ->addObserver(SecondObserver);
    myObserved
    ->addObserver(ThirdObserver);

    myObserved
    ->notifyToObservers();//通知所有观察者

    cout
    <<endl;
    cout
    <<"从列表中移除观察者SleepingObserver后再通知:"<<endl<<endl;
    myObserved
    ->removeObserver(SecondObserver);//移除第二个观察者SleepingObserver
    myObserved->notifyToObservers();//通知所有观察者

    delete FirstObserver;
    delete SecondObserver;
    delete ThirdObserver;
    system(
    "pause");
    return 0;
    }

     运行结果:

  • 相关阅读:
    2246 练习sql语句(上)
    202242 mysql卸载干净
    22412 mysql报错编号1045(下)
    22410 理解接口的含义?
    22410 express.js接口
    2243 mysql管理工具sqlyog错误号码篇(上)
    22331 提交项目代码git的一些补充(拒绝合并)
    22412 sql语句报错编号记录(上)+sql语法
    2022331 express app.listen引发的思考(1)
    202242 mysql初识
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2168936.html
Copyright © 2020-2023  润新知