观察者Observer模式的代码实现
本项目中采用观察者模式,主要是为了进行数据的传递,如IDemux解封装出的音视频码流数据时,通知音视频解码类IDecode进行解码
观察者接口类IObserver
#ifndef BOPLAY_IOBSERVER_H
#define BOPLAY_IOBSERVER_H
#include "XData.h"
#include "XThread.h"
#include <vector>
#include <mutex>
class IObserver : public XThread {
public:
virtual void update(XData xData){}
void addObs(IObserver *observer);
void Notify(XData xData);
protected:
std::vector<IObserver *> observers;
std::mutex mux;
};
#endif
#include "IObserver.h"
void IObserver::addObs(IObserver *observer) {
if (!observer){
return;
}
mux.lock();
observers.push_back(observer);
mux.unlock();
}
void IObserver::Notify(XData xData) {
mux.lock();
for (auto & observer : observers) {
observer->update(xData);
}
mux.unlock();
}
解封装接口类IDemux使用观察者模式
#ifndef BOPLAY_IDEMUX_H
#define BOPLAY_IDEMUX_H
#include "XData.h"
#include "XThread.h"
#include "IObserver.h"
class IDemux: public IObserver {
public:
virtual bool Open(const char *url) = 0;
virtual XData Read() = 0;
int totalMs = 0;
protected:
virtual void main();
};
#endif
#include "IDemux.h"
#include "XLog.h"
void IDemux::main() {
while(!isExit){
XData xData = Read();
if (xData.size > 0){
Notify(xData);
}
}
}