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


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) 評論(3) 編輯 收藏 引用 所屬分類: 設(shè)計模式