前言
在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。
组件协作:
Observer
1.使用场合
- 为某些对象建立一种
“通知依赖关系”
:即一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。 - 场景举例:
- 微信公众号,如果一个用户订阅了某个公众号,那么便会收到公众号发来的消息,那么,公众号就是『被观察者』,而用户就是『观察者』
- 气象站可以将每天预测到的温度、湿度、气压等以公告的形式发布给各种第三方网站,如果天气数据有更新,要能够实时的通知给第三方,这里的气象局就是『被观察者』,第三方网站就是『观察者』
- 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 =