一、简介
1. 概念
GOF的《设计模式》这样定义观察模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。
2. 目的
解决多个对象同时关系一个实体的变更状态的问题。
3. 优点
1)运行时我们变更观察者,被观察对象不会受到影响;
2)可以动态添加观察者;
3)改变被观察者或者观察者的任何一方都不会影响另一方。
二、结构类图
三、代码示例
1 #ifndef Observe_h
2 #define Observe_h
3
4 using namespace std;
5
6 class ConfigObserverMgr;
7
8 class IObserver
9 {
10 public:
11 IObserver();
12 virtual ~IObserver() {};
13
14 virtual int update() = 0;
15 private:
16
17 };
18
19 class Config1Observer : public IObserver
20 {
21 public:
22 Config1Observer();
23 virtual ~Config1Observer() {};
24
25 virtual int update()
26 {
27 //todo
28 };
29
30 };
31
32 class Config2Observer : public IObserver
33 {
34 public:
35 Config2Observer();
36 virtual ~Config2Observer();
37
38 virtual int update()
39 {
40 //todo
41 };
42
43 };
44
45 class ConfigObserverMgr
46 {
47 public:
48 ConfigObserverMgr();
49 virtual ~ConfigObserverMgr() {};
50
51 void registerObserver(IObserver* observer)
52 {
53 if (!m_observerList.contains(observer))
54 {
55 m_observerList.append(observer);
56 }
57 };
58 void unregisterObserver(IObserver* observer)
59 {
60 if (!m_observerList.contains(observer))
61 {
62 m_observerList.removeOne(observer);
63 }
64 };
65 void notifyUpdate()
66 {
67 for (auto observer : m_observerList)
68 {
69 observer->update();
70 }
71 };
72 private:
73 QList<IObserver*> m_observerList;
74 };
75
76 class ISubject
77 {
78 public:
79 ISubject(ConfigObserverMgr* mgr)
80 :m_observerMgr(mgr)
81 {};
82 virtual ~ISubject() {};
83
84 virtual void stateChanged();
85
86 void addObserver(IObserver *observer)
87 {
88 m_observerMgr->registerObserver(observer);
89 };
90
91 void removeObserver(IObserver *oberser)
92 {
93 m_observerMgr->unregisterObserver(oberser);
94 };
95
96 void notify()
97 {
98 if (nullptr != m_observerMgr)
99 {
100 m_observerMgr->notifyUpdate();
101 }
102 };
103 protected:
104 ConfigObserverMgr *m_observerMgr;
105 };
106
107 class ConfigSubject : public ISubject
108 {
109 ConfigSubject(ConfigObserverMgr* mgr)
110 : ISubject(mgr)
111 {};
112 virtual ~ConfigSubject() {};
113
114 void stateChanged()
115 {
116 notify();
117 };
118
119 void main()
120 {
121 ConfigObserverMgr *mgr = new ConfigObserverMgr; // 创建一个观察者管理者
122 ConfigSubject *subject = new ConfigSubject(mgr);// 创建被观察的实体
123
124 Config1Observer *config1 = new Config1Observer; // 创建观察者1
125 Config2Observer *config2 = new Config2Observer; // 创建观察者2
126
127 // 注册观察者
128 subject->addObserver(config1);
129 subject->addObserver(config2);
130
131 subject->stateChanged(); // 状态变更,通知各个观察者
132 };
133
134 #endif // !Observe_h
借鉴实际使用中的一些经验,本例中在原有的观察者模式中,抽取了一个观察者管理者,可以更加便利的管理观察的注销、注册与通知。
以上为现阶段的学习总结,后续如有新的理解,会及时更新。