設(shè)計(jì)模式之Observer模式
引例:
銀行現(xiàn)在的業(yè)務(wù)大多有提醒業(yè)務(wù),比如我們用信用卡消費(fèi)的時(shí)候銀行會(huì)有短信通知和Email通知等方法立即提醒客戶賬戶發(fā)生了變化。這就是典型的Observer模式,A(賬戶)發(fā)生變化之后通知B(手機(jī))和C(Email),以后也許還會(huì)通知D(電話)等等。。。
程序設(shè)計(jì)中也會(huì)遇到很多這樣的問(wèn)題,比如說(shuō)MFC中的Document/View架構(gòu),Document中的數(shù)據(jù)變化會(huì)立即通知View的顯示也相應(yīng)變化,View的顯示變化后也會(huì)通知Document中的數(shù)據(jù)產(chǎn)生對(duì)應(yīng)變化;再比如回調(diào)函數(shù),觸發(fā)某個(gè)事件后通知調(diào)用回調(diào)函數(shù)。但凡“通知依賴”問(wèn)題大都可以用到Observer模式。
動(dòng)機(jī):
為某些對(duì)象建立“通知依賴關(guān)系”——“一個(gè)對(duì)象的狀態(tài)發(fā)生改變,那么與之相關(guān)的所有對(duì)象都要改變”。
顯然這種關(guān)系是緊耦合的,為保證這種結(jié)構(gòu)在遇到變化時(shí)能夠比較穩(wěn)定,我們必須使之松耦合。
意圖:
定義對(duì)象間的一種一對(duì)多關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象都得到通知和自動(dòng)更新(GoF23)
設(shè)計(jì)思路:
我們的目的是在A的狀態(tài)發(fā)生改變時(shí)會(huì)自動(dòng)通知B,上下兩幅圖分別代表了兩個(gè)設(shè)計(jì)的方法。
上圖是一種較容易想到的解決方法,但是可以看出A依賴于B,兩者是緊耦合關(guān)系。
OO中有一個(gè)重要的原則就是“依賴倒置原則”,于是就有了下圖:
接口IA依賴于接口IB,而IA和IB是從A,B中抽象出來(lái)的相對(duì)穩(wěn)定的部分,IA和IB之間的依賴關(guān)系相對(duì)穩(wěn)定,不易變化。
Ok,就是這么簡(jiǎn)單!Observer模式的思想就是這樣!問(wèn)題的關(guān)鍵在于如何抽象IA和IB,下面是GoF23對(duì)Observer模式描述的UML圖
其中Subject即接口IA,Observer即接口IB。
Observer只有一個(gè)方法Update,用于更新具體的Observer。
Subject一般有一個(gè)List用于保存Observer的信息;Attach負(fù)責(zé)添加Observer;Detach負(fù)責(zé)刪除Observer;Notify通知List中的所有Observer調(diào)用Update。
關(guān)于內(nèi)存釋放:
需要注意的是在ISubject的析構(gòu)函數(shù)中清空List之前,必須首先釋放其中每個(gè)指針的內(nèi)存
自己測(cè)試用的代碼,僅供參考


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

71

72

73

74

75

76

77

78

79

80



81

82

83

84



85



86

87

88

89

90

91

92

93



94

95

96



97

98

99

100

101

102



103

104



105

106

107

108

109

110

111



112


113


114


115

116

117

118

119

120

121

122

123

124

125

126



127

128

129

130

posted on 2009-04-05 22:51 Alex@VCC 閱讀(1766) 評(píng)論(3) 編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式