设计模式系列之观察者模式(Observer pattern)

本文将简单介绍观察者模式(Observer pattern)

功能

观察者模式(Observer pattern)**也叫发布-订阅模式(Publish/Subject)模式**,实现了一种一对多的依赖关系,可以让多个观察者对象监听同一个主题对象、这个主题对象在状态发生变化时,会通知各个观察者对象,使它们根据收到的消息进行更新。

UML结构图

实例

对象的观察者模式

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <vector>

using namespace std;

class Observer {
public:
virtual void update() {}
};

class Subject {
public:
void attach(Observer * o) {
observers.push_back(o);
}

void detach(Observer * o) {
for (vector<Observer *>::iterator it = observers.begin(); it!=observers.end(); it++) {
if (*it == o) {
observers.erase(it);
break;
}
}
}

void notify() {
int count = observers.size();
for (int i = 0; i < count; i++) {
observers.at(i)->update();
}
}

private:
vector<Observer*> observers;
};

class ConcreteSubject : public Subject {
public:
string subjectState;
};

class ConcreteObserver : public Observer {
public:
ConcreteObserver(string name, ConcreteSubject * subject) {
this->name = name;
this->subject = subject;
}
string oberverState;
virtual void update() {
oberverState = subject->subjectState;
cout << "观察者:" << name.c_str() << " 新状态:" <<oberverState.c_str() << endl;
}
private:
string name;
ConcreteSubject * subject;
};

int main()
{
ConcreteSubject subject1;

ConcreteObserver observer1("A", &subject1);
ConcreteObserver observer2("B", &subject1);

subject1.attach(&observer1);
subject1.attach(&observer2);

subject1.subjectState = "123";
subject1.notify();
}

但是在这个例子中观察者对象和主题对象需要互相知道,还是有一定的耦合性,除了基于对象,还可以基于函数的来,由于C++没有自带托管功能,具体实现就暂时不展示了

END

2018-10-11 完成

2018-10-11 立项