跳到主要内容

观察者模式

  观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
  当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式

主要解决的问题

  • 观察者模式解决的是一个对象状态改变时,如何自动通知其他依赖对象的问题,同时保持对象间的低耦合和高协作性。

使用场景

  • 当一个对象的状态变化需要同时更新其他对象时。

实现方式

  • 定义观察者接口:包含一个更新方法。
  • 创建具体观察者:实现观察者接口,定义接收到通知时的行为。
  • 定义主题接口:包含添加、删除和通知观察者的方法。
  • 创建具体主题:实现主题接口,管理观察者列表,并在状态改变时通知它们。

关键代码

  • 观察者列表:在主题中维护一个观察者列表。

实现

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <list>
class Subject;
class Observer {
public:
Observer(Subject * subject);
virtual void update() = 0;
private:
Subject* m_subject;
};
class Subject {
public:
int getState() { return m_state; }
void setState(int state) {
m_state = state;
notifyAllObserver();
}
void attach(Observer* ob) {
m_list.push_back(ob);
}
private:
void notifyAllObserver() {
for (Observer* observer : m_list) {
observer->update();
}
}
std::list<Observer*> m_list;
int m_state;
};
Observer::Observer(Subject * subject) :m_subject(subject) {
m_subject->attach(this);
}
class BinaryObserver:public Observer {
public:
BinaryObserver(Subject* subject) :Observer(subject) {

}
void update() {
printf("from binaryobserver \n");
}
};
class HexObserver : public Observer {
public:
HexObserver(Subject* subject) :Observer(subject) {

}
void update() {
printf("from hexobserver \n");
}
};

int main() {
Subject subject;
BinaryObserver bob(&subject);
HexObserver hob(&subject);
subject.setState(5);
subject.setState(6);
getchar();
return 0;
}