• 观察者模式


    观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

    我们每天都要根据天气来做一些事情

    #include "stdafx.h"
    #include <stdio.h>
    #include<iostream>
    #include <string.h>

    #include<stack>
    #include<vector>
    #include<deque>
    #include<list>
    #include <iterator>
    using namespace std;

    typedef enum
    {
        rainy,
        sunny,
        foggy
    } weatherStatus;

    class weather;


    class ob
    {
    public:
        ob::ob();
        ob:: ~ob();
        virtual void ob::update()=0;
        static weather* p_weather;
    };

    class peopleSH : public ob
    {
    public:
        peopleSH(string name);
        ~peopleSH();
        void update();
    private:
        string mName;
    };

    class weather
    {
    public :
        weather();
        virtual ~weather();
        void attachob(ob* P_ob);
        void remove(ob* P_ob);
        void notify();
        weatherStatus getWeatherStatus();
        void setWeatherStatus(weatherStatus weather);
    private:
        list <ob*> mObList;
        weatherStatus mWeather;
    };

    class weatherSH : public weather
    {
    public:
         weatherSH();
        ~weatherSH();
    };

    weather::weather():mWeather(sunny){};
    weather::~weather(){};
    void weather::attachob(ob* P_ob){mObList.push_back(P_ob);};
    void weather::remove(ob* P_ob) {mObList.remove(P_ob);};
    void weather::notify()
    {
        list <ob*> ::iterator it = mObList.begin();
        for(;it!= mObList.end();++it)
        {
            (*it)->update();
        }
    };
     void weather::setWeatherStatus(weatherStatus weather)
    {
        mWeather = weather;
    }
    weatherStatus weather::getWeatherStatus(void)
    {
        return mWeather;
    }

        weatherSH::weatherSH(){};
        weatherSH::~weatherSH(){};

        ob::ob(){};
        weather* ob::p_weather = new weatherSH();
        ob:: ~ob()
        {
            if(p_weather != NULL)
            {
                delete p_weather;
                p_weather = NULL;
            }
        };


        peopleSH::peopleSH(string name):mName(name)
        {
        };
        peopleSH::~peopleSH()
        {
        };


        void peopleSH::update()
        {
            weatherStatus today = p_weather->getWeatherStatus();
            switch(today)
            {
                case rainy:  cout<< mName.c_str() << " : get the umbrella"<<endl; break;
                case sunny:  cout<< mName.c_str() << " :mood seems good"<<endl; break;
                case foggy:  cout<< mName.c_str() << " : it seems bad"<<endl; break;
                default: cout << "weather error!"<<endl; break;
            }
        }


    void main()
    {
        ob * p_ob1 = new peopleSH("banana");
        ob * p_ob2 = new peopleSH("apple");
        weather* p_sh =ob::p_weather;
        p_sh->attachob(p_ob1);
        p_sh->attachob(p_ob2);
        p_sh->setWeatherStatus(rainy);
        p_sh->notify();
        p_sh->setWeatherStatus(foggy);
        p_sh->notify();
        cin.get();
    }
    总的来说,就是将观察者加到观察对象的成员list中,当观察对象发布消息时notify,遍历list去更新观察者的行为

    这是一种很好用的模式,和函数指针的思想类似,关注这个消息的对象去注册它,发布命令时调用

  • 相关阅读:
    Java finally语句到底是在return之前还是之后执行?
    图文介绍openLDAP在windows上的安装配置
    ES之十:ElasticSearch监控工具 cerebro
    ES之八:ES数据库重建索引——Reindex(数据迁移)
    ES index的数据量大于1万的特殊处理场景
    Java中的Hashtable实现方法
    form表单回车提交问题(转)
    ES之九:ES Java客户端Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
    NetBeans 7.0 安装Python插件的方法
    python学习笔记
  • 原文地址:https://www.cnblogs.com/doulcl/p/10171194.html
Copyright © 2020-2023  润新知