设计模式之观察者模式(Observer)

前言

在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。
在这里插入图片描述
组件协作:
在这里插入图片描述

Observer

1.使用场合

  1. 为某些对象建立一种“通知依赖关系”:即一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
  2. 场景举例:
  • 微信公众号,如果一个用户订阅了某个公众号,那么便会收到公众号发来的消息,那么,公众号就是『被观察者』,而用户就是『观察者』
  • 气象站可以将每天预测到的温度、湿度、气压等以公告的形式发布给各种第三方网站,如果天气数据有更新,要能够实时的通知给第三方,这里的气象局就是『被观察者』,第三方网站就是『观察者』
  • MVC模式中的模型与视图的关系也属于观察与被观察

以上场景举例来源自:链接

2.示例1:文件分割进度显示

假设我们要将一个大文件分割成几个小文件分别存储,并且在分割过程中实时显示分割的进度。这里就可以使用观察者模式,观察者就是进度显示的类,被观察者就是文件分割类。

观察者可以有多个,被观察者改变时需要通知哪些观察者是客户程序决定的。所以被观察者应该有方法删除和增加需要通知的观察者。

#include <iostream>
#include <list>
#include<string>

using namespace std;

//进度显示接口
class IProgress{
   
public:
	virtual void DisplayProgress(float value) = 0;
	virtual ~IProgress(){
   }
};

//文件分割类
class FileSplitter
{
   
private:
	string m_filePath;
	int m_fileNumber;

	list<IProgress*>  m_iprogresslist; // 抽象通知机制,支持多个观察者

public:
	FileSplitter(const string& filePath, int fileNumber) 
		:m_filePath(filePath),m_fileNumber(fileNumber)
	{
   }

	void split()
	{
   
		//1.读取大文件
		cout << "读取文件大小....." << endl;

		//2.分批次向小文件中写入
		cout << "拆分文件,写入小文件大小....." << endl;
		for (int i = 0; i < m_fileNumber; i++){
   
			float progressValue = m_fileNumber;
			progressValue = 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值