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


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