设计模式学习——观察者模式(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

 

转载于:https://www.cnblogs.com/zqctzk/p/11127480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值