[设计模式] 观察者( Observer )模式学习笔记
最近在学习node.js,里面讲到node.js的事件机制使用了观察者模式,因此来学习一下。
观察者模式的目的是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
因此观察者模式又叫发布-订阅模式。
下面放一个简化之后的例子:
1
2
3 #include <iostream>
4 #include <vector>
5 #include <string>
6 using namespace std;
7 class Secretary;
8 // 看股票的同事类(观察对象,观察者)
9 class StockObserver
10 {
11 public:
12 StockObserver(string strName, Secretary* strSub)
13 {
14 name = strName;
15 sub = strSub;
16 }
17
18 void Update();
19
20 private:
21 string name;
22 Secretary* sub;我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
23 };
24
25 // 秘书类(主题对象,通知者)
26 class Secretary
27 {
28
29 public:
30 string action;
31 void Add(StockObserver ob) { observers.push_back(ob); }
32 void Remove(int addIndex)
33 {
34 if(addIndex >=0 && addIndex < observers.size())
35 observers.erase(observers.begin() + addIndex);
36 }
37 void Notify()
38 {
39 vector<StockObserver>::iterator it;
40 for (it=observers.begin(); it!=observers.end(); ++it)
41 {
42 (*it).Update();
43 }
44 }
45
46 private:
47 vector<StockObserver> observers;
48 };
49
50
51
52
53 void StockObserver::Update()
54 {
55 cout << name << " : " << sub->action << ", begin to work" << endl;
56 }
57
58 int main()
59 {
60 // 创建通知者
61 Secretary* p = new Secretary();
62
63 // 观察者
64 StockObserver* s1 = new StockObserver("Lazy", p);
65 StockObserver* s2 = new StockObserver("SnowFire", p);
66
67 // 加入通知队列
68 p->Add(*s1);
69 p->Add(*s2);
70
71 // 事件
72 p->action = "The boss is coming...";
73
74 // 通知
75 p->Notify();
76
77 // 动态删除
78 p->Remove(0);
79
80 p->Notify();
81
82 return 0;
83
84
85
update:怪不得觉得熟悉,原来Qt的信号槽机制Signals_and_slots 就是使用了观察者模式。
参考资料: