观察者模式

观察者模式

1.何为观察者模式

​ 观察者模式定义了一种一对多(变化)的依赖关系,以便当一个对象发生变化时,所有依赖与它的对象都能接受到通知并做出相应更新。

2.观察者模式的意义和使用场景

​ 在软件构建中,我们可能需要对一些对象建立一种“通知依赖关系”,当一个对象(目标对象)的状态发生了改变,,所有依赖对象(观察者)都能收到通知。观察者模式解开了二者之间的耦合,使得我们可以独立地改变目标和观察者。这是依赖倒置原则的体现。

3.观察者模式的实现

​ 创建一个观察者基类,所有观察者继承于该基类,去实现对不同状态的观察。在目标对象中包含一个观察者集合,代表订阅当前对象的观察者,当目标变化发生时,无需指定某个观察者,通知(可以携带通知信息作为参数)将自动传播到所有订阅观察者。观察者自己决定是否订阅,目标对象对此一无所知。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 抽象观察者类
class Observer {
public:
virtual void update() = 0;
};
// 具体观察者类 - 学生
class Student : public Observer {
private:
std::string name;

public:
Student(const std::string& name) : name(name) {}

void update() override {
std::cout << name << " received a notification" << std::endl;
}
};
// 抽象主题类
class Subject {
private:
std::vector<Observer*> observers;

public:
// 注册观察者
void attach(Observer* observer) {
observers.push_back(observer);
}

// 取消注册观察者
void detach(Observer* observer) {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}

// 通知所有观察者
void notify() {
for (Observer* observer : observers) {
observer->update();
}
}
};
// 具体主题类 - 教师
class Teacher : public Subject {
public:
void teach() {
std::cout << "Teacher is teaching" << std::endl;
notify(); // 通知所有观察者
}
};