我们在做某一些操作的时候,遇到不同状态的时候就会有不同的处理方式。为了判别这些状态,我们必然会使用大量的if else语句来做状态判断处理。而随着if else(或switch case)语句的增多,程序的可读性,扩展性也会变得很弱。维护也会很麻烦,你可能看到过有的代码中 一个函数就有n多if语句,代码甚至超过了上千行。
举一个例子:我们给一部手机打电话,就可能出现这几种情况:用户开机,用户关机,用户欠费停机,用户消户等。 所以当我们拨打这个号码的时候:系统就要判断,该用户是否在开机且不忙状态,又或者是关机,欠费等状态。但不管是那种状态我们都应给出对应的处理操作。下面我们用代码来模拟一下这个过程。


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

注意,看看上面的代码,显然它已经完成了我们的基本业务操作,但是,一旦我们有新的状态加入的话,我们势必要在每个业务方法里边增加相应的else if语句。所以加入x个状态就有可能加入n*x条else if语句,n表示函数(业务方法)的数量。
状态模式:把不同状态的操作分散到不同的状态对象里去完成。看看状态类的uml类图。
从上图可以看出,每一个状态类都会去处理所有的业务方法,根据他自身的状态,去让不同函数(业务方法)作相应的不同处理。而我们先前的方式是,在不同的函数(业务方法)里去判断不同状态,然后分别对每一个状态作不同的处理。很显然,我们采用状态模式的方式在后续扩张和维护能力上都得到了很大程度提高,比如我们先加入一个状态,我就只仅仅需要加入一个相应的状态类就可以了。代码量也就是实现该状态下各个函数的不同处理过程而已。好,看看实现代码:


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

状态模式和策略模式的最大区别在于它有状态间的切换,一个状态完了,就要切换到它下一个状态。
转载:http://www.blogjava.net/samyang/archive/2008/03/14/184700.html