設(shè)計(jì)模式之狀態(tài)模式
哎,最近一直在河北華為移動(dòng)項(xiàng)目組做外包,一直也沒有機(jī)會(huì)寫什么代碼,也沒機(jī)會(huì)上網(wǎng) ,真的是郁悶死了。
我們?cè)谧瞿骋恍┎僮鞯臅r(shí)候,遇到不同狀態(tài)的時(shí)候就會(huì)有不同的處理方式。為了判別這些狀態(tài),我們必然會(huì)使用大量的if else語句來做狀態(tài)判斷處理。而隨著if else(或switch case)語句的增多,程序的可讀性,擴(kuò)展性也會(huì)變得很弱。維護(hù)也會(huì)很麻煩,你可能看到過有的代碼中 一個(gè)函數(shù)就有n多if語句,代碼甚至超過了上千行。
舉一個(gè)例子:我們給一部手機(jī)打電話,就可能出現(xiàn)這幾種情況:用戶開機(jī),用戶關(guān)機(jī),用戶欠費(fèi)停機(jī),用戶消戶等。 所以當(dāng)我們撥打這個(gè)號(hào)碼的時(shí)候:系統(tǒng)就要判斷,該用戶是否在開機(jī)且不忙狀態(tài),又或者是關(guān)機(jī),欠費(fèi)等狀態(tài)。但不管是那種狀態(tài)我們都應(yīng)給出對(duì)應(yīng)的處理操作。下面我們用代碼來模擬一下這個(gè)過程。

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

注意,看看上面的代碼,顯然它已經(jīng)完成了我們的基本業(yè)務(wù)操作,但是,一旦我們有新的狀態(tài)加入的話,我們勢(shì)必要在每個(gè)業(yè)務(wù)方法里邊增加相應(yīng)的else if語句。所以加入x個(gè)狀態(tài)就有可能加入n*x條else if語句,n表示函數(shù)(業(yè)務(wù)方法)的數(shù)量。
狀態(tài)模式:把不同狀態(tài)的操作分散到不同的狀態(tài)對(duì)象里去完成。看看狀態(tài)類的uml類圖。
從上圖可以看出,每一個(gè)狀態(tài)類都會(huì)去處理所有的業(yè)務(wù)方法,根據(jù)他自身的狀態(tài),去讓不同函數(shù)(業(yè)務(wù)方法)作相應(yīng)的不同處理。而我們先前的方式是,在不同的函數(shù)(業(yè)務(wù)方法)里去判斷不同狀態(tài),然后分別對(duì)每一個(gè)狀態(tài)作不同的處理。很顯然,我們采用狀態(tài)模式的方式在后續(xù)擴(kuò)張和維護(hù)能力上都得到了很大程度提高,比如我們先加入一個(gè)狀態(tài),我就只僅僅需要加入一個(gè)相應(yīng)的狀態(tài)類就可以了。代碼量也就是實(shí)現(xiàn)該狀態(tài)下各個(gè)函數(shù)的不同處理過程而已。好,看看實(shí)現(xiàn)代碼:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


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


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


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

posted on 2008-03-14 13:51 sam.chuan.yang 閱讀(5904) 評(píng)論(2) 編輯 收藏 所屬分類: 23設(shè)計(jì)模式的理解