观察者模式是一种经常使用的设计模式。在软件系统中对象并不是孤立存在的,一个对象行为的改变可能导致一个或者多个其他与之存在依赖关系的对象行为发生改变。使用一种触发的技术使得相互相关的对象发生相应的动作。
意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

1 #include <iostream>
2 #include <string>
3 #include <list>
4 using namespace std;
5 // 观察者模式
6
7 //
8 class CMyObserver // 观察者抽象类
9 {
10 public:
11 CMyObserver() {}
12 virtual ~CMyObserver() {}
13 virtual void response() = 0;
14 };
15
16 class CMySubject // 被观察者类
17 {
18 private:
19 list<CMyObserver *> m_lstObserver;
20 public:
21 void attach(CMyObserver & ob)
22 {
23 m_lstObserver.push_back(&ob);
24 }
25
26 void Detach(CMyObserver & ob)
27 {
28 // m_lstObserver.remove(*ob);
29 }
30 void Notify() // 被观察者通知观察者发生行为改变
31 {
32 cout << "猫叫!" << endl;
33 CMyObserver *ob;
34 for(list<CMyObserver *>::iterator ix = m_lstObserver.begin();ix != m_lstObserver.end();ix++)
35 {
36 ob = *ix;
37 ob->response();
38 }
39 }
40 };
41
42 class CMouse : public CMyObserver // 具体观察者类 老鼠
43 {
44 public:
45 CMouse() {}
46 ~CMouse() {}
47 virtual void response()
48 {
49 cout << "老鼠努力逃跑" << endl;
50 }
51 };
52
53 class CDog : public CMyObserver // 具体观察者类 狗
54 {
55 public:
56 CDog() {}
57 ~CDog() {}
58 virtual void response()
59 {
60 cout << "狗跟着叫" << endl;
61 }
62 };
63 void main()
64 {
65 CMySubject cat;
66 CMyObserver *o1,*o2;
67 o1 = new CMouse;
68 o2 = new CDog;
69 cat.attach(*o1);
70 cat.attach(*o2);
71 cat.Notify(); // 当猫叫时,老鼠会跑,狗也会叫
72
73 delete o1;
74 delete o2;
75
76 }