設(shè)計(jì)模式之Strategy模式
Strategy模式是設(shè)計(jì)模式中非常常用的一種設(shè)計(jì)模式,甚至在你沒(méi)有學(xué)習(xí)過(guò)設(shè)計(jì)模式之前就已經(jīng)使用過(guò)這種模式。先看個(gè)簡(jiǎn)單的例子吧:比如說(shuō)你要寫(xiě)個(gè)List的容器,需要有一個(gè)Sort方法。但是對(duì)于容器中不同類(lèi)型的對(duì)象Sort方法可能會(huì)不一樣,比如說(shuō)Point類(lèi)型可能根據(jù)point到原點(diǎn)的距離或者point的xy之和來(lái)比較大小。
一種很自然的想法就是:

2



3

4

5



6

7

8



9

好在我們有Stratregy模式能搞定這類(lèi)變化問(wèn)題(設(shè)計(jì)模式的根本目的就是在于抑制變化對(duì)程序的影響)
動(dòng)機(jī):
軟件構(gòu)建中,某些對(duì)象使用的算法可能多種多樣,我們需要的是將算法和對(duì)象本身解耦,在運(yùn)行時(shí)根據(jù)需要透明地更改對(duì)象的算法。
意圖:
定義一系列的算法,把他們一個(gè)個(gè)封裝起來(lái),并且使他們可以相互替換。該模式使得算法可以獨(dú)立于它的客戶而變化。(GoF23)
設(shè)計(jì)思路:
我們的目的是讓Context能在各種Algorithm之間切換,如下圖:

上圖就是設(shè)計(jì)Sort時(shí)所用的最容易想到的方法,Context和三種Algorithm之間是緊耦合關(guān)系,對(duì)于需求的變化無(wú)能為力。
下圖仍然運(yùn)用的是OO中的“依賴倒置原則”,使用接口將算法和對(duì)象解耦,抽象出描述算法功能要求的IStrategy接口。這樣Context和IStrategy成為相對(duì)穩(wěn)定的松耦合關(guān)系,運(yùn)行時(shí)多態(tài)來(lái)控制到底運(yùn)用何種算法來(lái)解決實(shí)際問(wèn)題,而避免了if...else...的靜態(tài)控制。
總結(jié):
1.“依賴倒置原則”,抽象出接口,使得Context“間接”依賴算法,兩者由緊耦合變?yōu)樗婉詈稀?br>2.對(duì)于不同的算法,分別封裝成為具體類(lèi),實(shí)現(xiàn)接口要求的功能(多態(tài)應(yīng)用)。
3.Strategy模式簡(jiǎn)單說(shuō)就是實(shí)現(xiàn)了算法的“靜態(tài)切換”到“動(dòng)態(tài)切換”的轉(zhuǎn)變(不光是算法,其他也都可以)。大多數(shù)情況下的if...else...和switch...case...(靜態(tài)切換)都能用Strategy模式(動(dòng)態(tài)切換)來(lái)替換,這也是Strategy模式廣泛使用的原因。
關(guān)于釋放內(nèi)存:
非常感謝有朋友指出我代碼中存在的問(wèn)題
主要的問(wèn)題是如何對(duì)Context中的釋放IS指針指向的內(nèi)存,具體還是看代碼中的Method函數(shù)和析構(gòu)函數(shù),如果還有問(wèn)題歡迎繼續(xù)指正 :-)
(指針初始化賦NULL,delete后仍然賦NULL,養(yǎng)成好習(xí)慣:-))
自己做的示例代碼,僅供參考


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

posted on 2009-04-06 15:21 Alex@VCC 閱讀(3166) 評(píng)論(7) 編輯 收藏 引用 所屬分類(lèi): 設(shè)計(jì)模式