一、前言
在日常的写代码中,观察者模式是很常见的一种模式,例如:在写入或者拷贝一个比较大的文件的过程中,我们常常需要知道进度是怎么样的。这样我们就希望有一些代码能够去实现这样的功能,观察者模式就诞生了。
二、模式介绍
观察者模式,主要是由两个类进行实现。
- 观察者类:主要负责接收被观察者发出的消息。进行相关的数据处理,消息提醒。
- 被观察者类:提供观察者的注册、注销、通知观察者。
看到两个类的职责我们就会发现实现起来很简单。
三、具体代码实现分析
#ifndef OBSERVER_H
#define OBSERVER_H
/*****************************************************
* 观察者模式
* Copyright (C) 2020 sinan Inc.
*
* This file is a design pattern.
*
* @file observer.h
* @brief 观察者模式
* @author sinan
* @date 2020/03/03
* @license GNU General Public License (GPL)
*
* Remark :
*
* ***************************************************/
#include <iostream>
#include <set>
/**
* @brief The Notify class
* 消息事件
* 提供两个参数:
* Type:事件的类型
* data:事件的数据
*/
class Notify
{
public:
/**
* @brief The Type enum
* 消息类型
*/
enum Type {
None,
Int,
Float,
Double,
Str,
User
};
Notify(Type type);
Notify(Type type, void *data);
virtual ~Notify();
/// 消息的类型
inline Type type() const { return static_cast<Type>(t); }
/// 获取消息的数据
inline void *data() const { return m_pData; }
protected:
int t;
void *m_pData;
};
/**
* @brief The Observer class
* 观察者基类
* 接收被观察者的事件消息
* 需要实现虚函数:void receiveNotify()
*/
class Observer
{
public:
Observer();
virtual ~Observer();
/// 接收被观察者消息虚函数
virtual void receiveNotify(Notify *notify = NULL) = 0;
};
/**
* @brief The Subject class
* 被观察者基类
* 发送事件到观察者中
*/
class Subject
{
public:
Subject();
virtual ~Subject();
/// 注册观察者
void attachObserver(Observer *obs);
/// 注销观察者
void detachObserver(Observer *obs);
/// 清空观察者
void clearObserver();
/// 通知消息到观察者
void notify(Notify *notify = NULL);
/// 获取观察者的个数
int getObserverCount();
private:
std::set<Observer *> m_setObs;
};
#endif // OBSERVER_H
#include "observer.h"
//@class Notify///
Notify::Notify(Type type) :
t(type)
{}
Notify::Notify(Type type, void *data) :
t(type),
m_pData(data)
{}
Notify::~Notify()
{}
//@class Observer///
Observer::Observer()
{}
Observer::~Observer()
{}
//@class Subject///
Subject::Subject()
{}
Subject::~Subject()
{
m_setObs.clear();
}
void Subject::attachObserver(Observer *obs)
{
if (obs) {
m_setObs.insert(obs);
}
}
void Subject::detachObserver(Observer *obs)
{
m_setObs.erase(obs);
}
void Subject::clearObserver()
{
m_setObs.clear();
}
void Subject::notify(Notify *notify)
{
std::set<Observer *>::iterator it = m_setObs.begin();
for (; it != m_setObs.end(); it++) {
if (*it) {
(*it)->receiveNotify(notify);
}
}
}
int Subject::getObserverCount()
{
return m_setObs.size();
}
具体的函数说明,以及实现都在源码中
四、总结
对设计模式的实现进行总结,以后有使用到相关的设计模式,会持续更新。