HeadFirst设计模式之观察者模式学习
  TEZNKK3IfmPf 2024年03月29日 37 0

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者,都会收到通知并自动更新。

二、我个人对于观察者模式的理解:

当主题发生改变时,自动通知到所有观察者,属于一种一对多的关系,作为观察者,而言,无需去访问主题,主题就会自动推送信息,一个简单的例子,对于微博而言,我们就相当于观察者,微博就相当于主题,我们只要负责登录微博,微博就会自动推送信息给我们。 这就是一个简单的观察者模式的理解。

三、观察者模式代码实现(C++)

例子:就用出版社和报社之间的订阅作为实现的范例。

头文件:

#pragma once
#include <iostream>
#include <string>
#include <vector>
using namespace std;



//观察者类的定义
class Suscriber
{
public:
Suscriber();
void update(string name);//更新
};

//出版者类的定义:主题
class Publisher
{
private:
string _writename;
vector<Suscriber*> _subVector;
public:
Publisher(); //构造函数
void addReader(Suscriber *); //添加读者
//void RemoveReader(Suscriber *); //移除读者
void setData(string news);
void Notify();//通知订阅者,订阅者即为观察者
vector<Suscriber*> getNums();

};

class YTouchSubsciber :public Suscriber //公有继承
{
private:
string _writer;
public:
YTouchSubsciber(string name);
void update(string name); //继承上面的
};

class GiserSubsciber :public Suscriber //公有继承
{
private:
string _writer;
public:
GiserSubsciber(string name);
void update(string name); //继承上面的
};

实现文件CPP

// ObserveModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include "Publisher.h"
#include <string>

using namespace std;


Publisher::Publisher()
{
_subVector.clear();// 将该清空
}

Suscriber::Suscriber()
{

}

void Suscriber::update(string name)
{
cout << "ddd";
}

void Publisher::setData(string news)
{
_writename = news;
}

YTouchSubsciber::YTouchSubsciber(string name)
{
_writer = name;
}

GiserSubsciber::GiserSubsciber(string name)
{
_writer = name;
}

void GiserSubsciber::update(string name)
{
cout << _writer + "love" + name <<endl;
}


void YTouchSubsciber::update(string name)
{
cout << _writer + "观察者处理了借了这本书 " + name << endl;
}

void Publisher::addReader(Suscriber * subs)
{
_subVector.push_back(subs);
}

vector<Suscriber*> Publisher::getNums()
{
return _subVector;
}

void Publisher::Notify()
{
for (int i = 0; i < _subVector.size(); ++i)
{
_subVector[i]->update(_writename);
}
}

int main()
{
Publisher * topicer = new Publisher(); //设置主题
YTouchSubsciber *yt_subWrite = new YTouchSubsciber("ytouch");
GiserSubsciber *bt_subWrite = new GiserSubsciber("giser");
topicer->addReader(yt_subWrite); //添加观察者
topicer->addReader(bt_subWrite);
topicer->setData("Happy Test"); //设置数据,传递给观察者
topicer->Notify(); //通知观察者
//std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月29日 0

暂无评论

TEZNKK3IfmPf