一、简介
1、状态模式中当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2、状态模式可以消化较大的分支,将每个分支放入一种状态中,减少了分支之间的耦合程度,又符合开闭原则。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
3、UML
4、所属类别:行为型
二、C++程序
1 // 状态模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 using namespace std;
7
8
9 class State
10 {
11 public:
12 State(){}
13 virtual ~State(){}
14 virtual void doit()=0;
15 };
16
17
18 class Havebreakfast:public State
19 {
20 private:
21 State *current_state;
22 public:
23 Havebreakfast(){}
24 virtual ~Havebreakfast(){}
25 virtual void doit()
26 {
27 cout<<"吃早饭"<<endl;
28 //current_state=new Havebreakfast();
29 //current_state->doit();
30 }
31 };
32 class Wash:public State
33 {
34 private:
35 State *current_state;
36 public:
37 Wash(){}
38 virtual ~Wash(){}
39 virtual void doit()
40 {
41 cout<<"洗漱"<<endl;
42 current_state=new Havebreakfast();
43 current_state->doit();
44 }
45 };
46 class Getup:public State
47 {
48 private:
49 State *current_state;
50 public:
51 Getup(){}
52 virtual ~Getup(){}
53 virtual void doit()
54 {
55 cout<<"起床"<<endl;
56 current_state=new Wash();
57 current_state->doit();
58 }
59 };
60 class Morning
61 {
62 private:
63 State * current_state;
64 public:
65 Morning()
66 {
67 current_state=new Getup();
68 }
69 ~Morning(){};
70 void doit()
71 {
72 current_state->doit();
73 }
74 };
75
76 int _tmain(int argc, _TCHAR* argv[])
77 {
78 Morning *m=new Morning();
79 m->doit();
80 return 0;
81 }