• 设计模式学习——观察者模式(c++)


    说明:本文主要是代码。主要内容包含下面三点。

    一,测试函数调用

    二,头文件(.h)内容

    三,源码(.cpp)内容

    正文

    一,测试函数调用方法

    #include "observer.h" //引入头文件
    int main()
    {
        testObeserver();//在main函数中调用测试函数
    }

    测试函数内容如下:

    void testObeserver()
    {
        Sound* m = new Music();//添加一首歌作为被观察者
    
        Listener* zhoujielun = new Funs("zhoujielun");//添加四个粉丝,作为观察者
        Listener* caiyilin = new Funs("caiyilin");
        Listener* dongxiaojie = new Funs("dongxiaojie");
        Listener* kunling = new Funs("kunling");
    
        m->addListener(zhoujielun);//注册观察者
        m->addListener(dongxiaojie);
        m->addListener(caiyilin);
        m->addListener(kunling);
    
        m->makeNoise("花田玫瑰");//被观察者发出广播
    
        
        delete m; m = nullptr;
        
    
    }

    执行结果:

    二,头文件(.h)内容

     1 #pragma once
     2 #include "util.h"
     3 #include <list>
     4 
     5 /*观察值模式
     6 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,
     7 所有依赖于它的对象都要得到通知并自动更新。
     8 
     9 */
    10 
    11 
    12 //////////////////////////////////////////////////////////////////////////
    13 //被观察者(Sound),观察者(listener)
    14 
    15 
    16 
    17 class Listener;//类的提前声明
    18 
    19 //被观察者抽象类
    20 class Sound
    21 {
    22 public:
    23     Sound();
    24     virtual ~Sound();
    25     virtual void addListener(Listener* listener) = 0;//观察者注册
    26     virtual void removeListener(Listener* listener) = 0;
    27     virtual void makeNoise(const string& noise) = 0;//向观察者广播消息
    28     
    29 };
    30 
    31 //被观察者具体类
    32 class Music:public Sound
    33 {
    34 public:
    35     Music();
    36     ~Music();
    37     void addListener(Listener* listener) override;
    38     void removeListener(Listener* listener) override;
    39     void makeNoise(const string& noise) override;
    40 
    41 private:
    42     list<shared_ptr<Listener>> _listenerlist;
    43 };
    44 
    45 //观察者抽象类
    46 class Listener
    47 {
    48 public:
    49     Listener();
    50     virtual ~Listener();
    51     virtual void listen(const string& noise) = 0;//接收被观察者广播的消息
    52     virtual void setListenerName(const string& name) = 0;
    53     virtual const string& name() = 0;
    54 
    55 };
    56 
    57 //观察者具体类
    58 class Funs :public Listener
    59 {
    60 public:
    61     Funs();
    62     Funs(const string& name);
    63     void listen(const string& noise) override;
    64     void setListenerName(const string& name) override;
    65     const string& name() override;
    66 
    67 private:
    68     string _name;
    69 };
    70 
    71 //测试
    72 void testObeserver();
    View Code

    三,源码(.cpp)内容

    #include "pch.h"
    #include "observer.h"
    
    Sound::Sound(){}
    
    Sound::~Sound(){}
    
    Music::Music(){}
    
    Music::~Music()
    {
        _listenerlist.clear();
    }
    
    void Music::addListener(Listener * listener)
    {
        shared_ptr<Listener> temp(listener);
        auto iter = find(_listenerlist.begin(), _listenerlist.end(), temp);
        if (iter == _listenerlist.end())
        {
            _listenerlist.push_front(temp);
        } 
        else
        {
            print("listener already exists");
        }
    }
    
    void Music::removeListener(Listener * listener)
    {
        auto iter = _listenerlist.begin();
        for (;iter!=_listenerlist.end();iter++)
        {
            if ((*iter).get()==listener)
            {
                _listenerlist.erase(iter);
                return;
            }
            
        }
    }
    
    void Music::makeNoise(const string& noise)
    {
        //notify listeners
        auto iter = _listenerlist.begin();
        for (;_listenerlist.end()!=iter;iter++)
        {
            (*iter).get()->listen(noise);
        }
    }
    
    Listener::Listener(){}
    
    Listener::~Listener(){}
    
    Funs::Funs():_name("unknown"){}
    
    Funs::Funs(const string & name):_name(name){}
    
    void Funs::listen(const string & noise)
    {
        print(this->name().data());
        print("listened ");
        print(noise.data());
    }
    
    void Funs::setListenerName(const string & name)
    {
        _name = name;
    }
    
    const string & Funs::name()
    {
        return _name;
    }
    
    
    void testObeserver()
    {
        Sound* m = new Music();
    
        Listener* zhoujielun = new Funs("zhoujielun");
        Listener* caiyilin = new Funs("caiyilin");
        Listener* dongxiaojie = new Funs("dongxiaojie");
        Listener* kunling = new Funs("kunling");
    
        m->addListener(zhoujielun);
        m->addListener(dongxiaojie);
        m->addListener(caiyilin);
        m->addListener(kunling);
    
        m->makeNoise("花田玫瑰");
    
        
        delete m; m = nullptr;
        
    
    }
    View Code
  • 相关阅读:
    [iOS开发] 使用Jenkins自动打包并上传至蒲公英
    修改Jenkins的BUILD_NUMBER
    RabbitMQ on windows开启远程访问
    SpringMVC 表单复选框处理
    Spring文件上传配置
    ES6中Reflect 与 Proxy
    vuex中getter的用法
    Toast组建的实现
    link和@import的区别
    Vue组件之props选项
  • 原文地址:https://www.cnblogs.com/zqctzk/p/11127480.html
Copyright © 2020-2023  润新知