首页 > 其他分享 >HeadFirst设计模式之观察者模式学习

HeadFirst设计模式之观察者模式学习

时间:2022-12-29 15:31:09浏览次数:39  
标签:HeadFirst name Publisher void 观察者 Suscriber 设计模式 string


一、观察者模式的定义:

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

 

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

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

 

三、观察者模式代码实现(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

相关文章

  • Alan Ezust-C++设计模式(基于Qt)-UMLChina讲座-音频和幻灯
    时间2008年7月15日(周二)上午10:00-12:00演讲人AlanEzust。《C++设计模式--基于Qt4开源跨平台开发框架》作者,曾在McGill大学、Suffolk大学以及Leamix、Nertel、Objectivity、......
  • 技术书籍也香艳-时隔12年《Head First设计模式》第二版要来了
    “技术书籍也香艳”,时隔12年《HeadFirst设计模式》第二版要来了,中译本将由UMLChina翻译。十几年前,这本书采用“小姐姐提神”(抖音?)的方式开启了一波HeadFirst流。很遗憾,第二......
  • 23种设计模式介绍
    一、什么是设计模式?设计模式(Designpattern)是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重......
  • 一篇文章带你了解设计模式原理——UML图和软件设计原则
    一篇文章带你了解设计模式原理——UML图和软件设计原则我们在学习过程中可能并不会关心设计模式,但一旦牵扯到项目和面试,设计模式就成了我们的短板这篇文章并不会讲到二十......
  • 观察者设计模式
    观察者设计模式:观察者设计模式解决问题时,当一个对象发生指定的动作时,要通知另外一个对象做出相应的处理。观察者设计模式的步骤:    1.当目前对象发生指定......
  • 工厂设计模式
    工厂设计模式作用:就是用于生产对象的。一、在Java项目中packagecom.cn.factory;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReade......
  • 设计模式之“状态模式(State)”(未完整)
    一、状态模式(State)状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 二、状态模式的作用状态模式主要解决的是当控制一个对象状态转......
  • 实践GoF的23种设计模式:命令模式
    摘要:命令模式可将请求转换为一个包含与请求相关的所有信息的对象,它能将请求参数化、延迟执行、实现Undo/Redo操作等。本文分享自华为云社区《【Go实现】实践GoF的23......
  • 23种设计模式 之 快速记忆
    导读本文仅仅是设计模式知识点汇总,适用于备考、想要装b的情况,不适用想要详细钻研学习的情况。1、什么叫做设计模式设计模式是解决方案!设计模式是解决反复出现问题......
  • 为什么说每个程序员都要尽早掌握设计模式相关知识?
    分享下前Google工程师「王争」对于这个话题的思考。 大家好,我是王争。 我相信,很多程序员都已经意识到基础知识的重要性,觉得要夯实基础,才能走得更远,但同时对于如何将基础......