一、观察者模式基本概念
1.1 观察者模式的动机
建立一个对象与对象之间的依赖关系,一个对象发生改变时,将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,被通知的对象称为观察者,一个观察目标可以对应多个观察者,观察者之间没有相互联系。
1.2 观察者模式定义
定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖的对象皆得到通知并被自动更新。
当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。观察者模式又叫发布-订阅模式、模型-视图模式。
//
// Created by 666 on 2023/11/20.
//
#include <iostream>
#include <list>
using namespace std;
/*抽象观察者*/
class Observer
{
public:
virtual void Update(int) = 0;
};
/*抽象目标*/
class Subject
{
public:
virtual void Attach(Observer *) = 0; //附加观察者
virtual void Detach(Observer *) = 0; //移除观察者
virtual void Notify() = 0; //通知观察者
};
/*具体观察者*/
class ConcreteObserver : public Observer
{
public:
ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}
void Update(int value)
{
cout << "ConcreteObserver get the update. New State:" << value << endl;
}
private:
Subject *m_pSubject; // 不知道为什么这个没用
};
/*具体观察者2*/
class ConcreteObserver2 : public Observer
{
public:
ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}
void Update(int value)
{
cout << "ConcreteObserver2 get the update. New State:" << value << endl;
}
private:
Subject *m_pSubject;
};
/*具体目标*/
class ConcreteSubject : public Subject
{
public:
void Attach(Observer *pObserver);
void Detach(Observer *pObserver);
void Notify();
void SetState(int state)
{
m_iState = state;
}
private:
std::list<Observer *> m_ObserverList;//观察者列表
int m_iState;
};
//附加观察者
void ConcreteSubject::Attach(Observer *pObserver)
{
m_ObserverList.push_back(pObserver);
}
//移除观察者
void ConcreteSubject::Detach(Observer *pObserver)
{
m_ObserverList.remove(pObserver);
}
//通知观察者
void ConcreteSubject::Notify()
{
std::list<Observer *>::iterator it = m_ObserverList.begin();
while (it != m_ObserverList.end()) // 每个都通知到位
{
(*it)->Update(m_iState);
++it;
}
}
int main()
{
// Create Subject 目标实例化
ConcreteSubject *pSubject = new ConcreteSubject();
// Create Observer 创建观察者
Observer *pObserver = new ConcreteObserver(pSubject);
Observer *pObserver2 = new ConcreteObserver2(pSubject);
// Change the state
pSubject->SetState(2);
// Register the observer
pSubject->Attach(pObserver);
pSubject->Attach(pObserver2);
pSubject->Notify();
// Unregister the observer
pSubject->Detach(pObserver);
pSubject->SetState(3);
pSubject->Notify();
delete pObserver;
delete pObserver2;
delete pSubject;
}