一、观察者模式的定义:
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者,都会收到通知并自动更新。
二、我个人对于观察者模式的理解:
当主题发生改变时,自动通知到所有观察者,属于一种一对多的关系,作为观察者,而言,无需去访问主题,主题就会自动推送信息,一个简单的例子,对于微博而言,我们就相当于观察者,微博就相当于主题,我们只要负责登录微博,微博就会自动推送信息给我们。 这就是一个简单的观察者模式的理解。
三、观察者模式代码实现(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 文件
标签:HeadFirst,name,Publisher,void,观察者,Suscriber,设计模式,string From: https://blog.51cto.com/u_15906863/5977848