观察者模式是一个应用非常广的模式之一,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。
具体C++实现代码如下:
#pragma once
#include <queue>
#include <iostream>
class Observer
{
public:
explicit Observer();
virtual ~Observer();
virtual void update(int value) = 0;
};
class Observer1 : public Observer
{
public:
explicit Observer1();
~Observer1();
void update(int value);
};
class Observer2 : public Observer
{
public:
explicit Observer2();
~Observer2();
void update(int value);
};
class Subscribe
{
public:
explicit Subscribe();
virtual ~Subscribe();
virtual void notify(int value);
void Register(Observer* pOb);
void unRegister(Observer* pOb);
protected:
std::vector<Observer*> m_observerVec;
};
class Subscribe1 : public Subscribe
{
public:
explicit Subscribe1();
~Subscribe1();
void notify(int value);
};
Observer::Observer()
{
}
Observer::~Observer()
{
}
Observer1::Observer1()
{
}
Observer1::~Observer1()
{
}
void Observer1::update(int value)
{
std::cout << this << "值改变:" << value << std::endl;
}
Observer2::Observer2()
{
}
Observer2::~Observer2()
{
}
void Observer2::update(int value)
{
std::cout << this << "值改变:" << value << std::endl;
}
Subscribe::Subscribe()
{
}
Subscribe::~Subscribe()
{
}
void Subscribe::notify(int value)
{
for (Observer* pOb : m_observerVec)
pOb->update(value);
}
void Subscribe::Register(Observer* pOb)
{
if (pOb == nullptr)return;
std::vector<Observer*>::iterator it = std::find(m_observerVec.begin(), m_observerVec.end(), pOb);
if (it == std::end(m_observerVec))
m_observerVec.emplace_back(pOb);
}
void Subscribe::unRegister(Observer* pOb)
{
if (pOb == nullptr)return;
std::vector<Observer*>::iterator it = std::find(m_observerVec.begin(), m_observerVec.end(), pOb);
if (it != std::end(m_observerVec))
m_observerVec.erase(it);
}
Subscribe1::Subscribe1()
{
}
Subscribe1::~Subscribe1()
{
}
void Subscribe1::notify(int value)
{
Subscribe::notify(value);
}