设计模式学习——观察者模式(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();
三,源码(.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; }