观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
假如我们现在有这么一个需求,对于不同的输入可以给出不同进制的输出。
那么被观察者就是输入,观察者就是三种进制的转换(bin、oct、hex)
这就是一种典型的一对多关系
Obeserver.hpp
#pragma once
#include <list>
#include <iostream>
#include <bitset>
// 观察对象为键盘输入
// 观察者基类
class Observer
{
public:
Observer() {};
~Observer() {};
virtual void update() {};
};
// 被观察者
class Subject
{
public:
Subject(int st = 0) :state(st) {};
int getState() {
return state;
}
void setState(int state) {
std::cout << "state change:" << std::dec << state << std::endl;
this->state = state;
notifyAllObservers();
}
void attach(Observer* observer) {
observers.push_back(observer);
}
void remove(Observer* observer) {
observers.remove(observer);
}
private:
void notifyAllObservers() {
for (Observer* observer : observers) {
observer->update();
}
}
private:
int state;
std::list<Observer*> observers;
};
// 三个观察者
/*二进制*/
class BinObserver :public Observer
{
public:
BinObserver(Subject* subject) :_subject(subject) {
subject->attach(this);
}
void update() {
std::cout << "BIN:" << std::bitset<32>(_subject->getState()) << std::endl;
}
private:
Subject* _subject;
};
/*八进制*/
class OctObserver :public Observer
{
public:
OctObserver(Subject* subject) :_subject(subject) {
subject->attach(this);
}
void update() {
std::cout << "OCT:" << std::oct << _subject->getState() << std::endl;
}
private:
Subject* _subject;
};
/*十六进制*/
class HexObserver :public Observer
{
public:
HexObserver(Subject* subject) :_subject(subject) {
subject->attach(this);
}
void update() {
std::cout << "HEX:" << std::hex << _subject->getState() << std::endl;
}
private:
Subject* _subject;
};
main.cpp
int main(int argc, const char* argv[])
{
Subject* test = new Subject();
Observer* ob1 = new BinObserver(test);
Observer* ob2 = new OctObserver(test);
Observer* ob3 = new HexObserver(test);
test->setState(10);
test->remove(ob3);
test->setState(16);
cin.get();
return 0;
}
参考资料:
https://www.runoob.com/design-pattern/observer-pattern.html