设计模式C++描述----16.状态(State)模式

一. 举例

一般汽车发动机工作时有四种状态,吸气、压缩、做功和排气。

在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态。

其实用户在使用时根本不知道当前的状态,也无需知道当前的状态。用户只需要给发动机一个初始状态,最后得到一个停止状态就行了。

结构图如下:

代码如下:
[cpp]  view plain copy
  1. //状态  
  2. class State  
  3. {  
  4. public:    
  5.     virtual void Operation(Work *work) {}  
  6. };  
  7.   
  8. //工作  
  9. class Work  
  10. {  
  11. private:  
  12.     State *m_state;  //目前状态  
  13.     int m_step;      //步骤  
  14.       
  15. public:    
  16.     Work(State *state): m_state(state), m_step(0)  
  17.     {}  
  18.    
  19.     ~Work()  
  20.     {  
  21.         delete m_state;  
  22.     }  
  23.       
  24.     int GetStep()  
  25.     {  
  26.         return m_step;  
  27.     }  
  28.       
  29.     void SetStep(int step)  
  30.     {  
  31.         m_step = step;  
  32.     }  
  33.       
  34.     void SetState(State *state)  
  35.     {  
  36.         delete m_state;  
  37.         m_state = state;  
  38.     }  
  39.   
  40.     void Operation()  
  41.     {  
  42.         m_state->Operation(this);  
  43.     }  
  44. };  
  45.   
  46. //排气状态  
  47. class ExhaustState: public State    
  48. {    
  49. public:    
  50.     void Operation(Work *work)  //排气操作  
  51.     {    
  52.         if(work->GetStep() == 4)    
  53.         {  
  54.             cout<<"Step : "<<work->GetStep()<<"排气操作"<<endl;    
  55.         }  
  56.     }  
  57. };  
  58.   
  59. //做功状态  
  60. class ActState: public State  
  61. {  
  62. public:  
  63.     void Operation(Work *work) //做功操作  
  64.     {  
  65.         if(work->GetStep() == 3)  
  66.         {  
  67.             cout<<"Step : "<<work->GetStep()<<"做功操作"<<endl;    
  68.         }  
  69.         else  
  70.         {  
  71.             work->SetState(new ExhaustState());  
  72.             work->Operation();  
  73.         }  
  74.     }  
  75. };    
  76.   
  77. //压缩状态  
  78. class CompressState: public State    
  79. {  
  80. public:  
  81.     void Operation(Work *work) //压缩操作  
  82.     {  
  83.         if(work->GetStep() == 2)  
  84.         {  
  85.             cout<<"Step : "<<work->GetStep()<<"压缩操作"<<endl;    
  86.         }  
  87.         else  
  88.         {  
  89.             work->SetState(new ActState());    
  90.             work->Operation();    
  91.         }    
  92.     }  
  93. };  
  94.   
  95. //吸气状态  
  96. class InhaleState: public State  
  97. {  
  98. public:    
  99.     void Operation(Work *work) //吸气操作  
  100.     {  
  101.         if(work->GetStep() == 1)  
  102.         {  
  103.             cout<<"Step : "<<work->GetStep()<<"吸气操作"<<endl;  
  104.         }  
  105.         else  
  106.         {  
  107.             State *p = new CompressState();  
  108.             work->SetState(p);  
  109.             work->Operation();  
  110.         }  
  111.     }  
  112. };  
  113.   
  114.   
  115. //测试代码  
  116. int main()    
  117. {  
  118.     State* st = new InhaleState(); //初始状态  
  119.   
  120.     Work *work = new Work(st);  
  121.   
  122.     for(int i = 1; i < 5; ++i)  
  123.     {  
  124.         work->SetStep(i);  
  125.           
  126.         work->Operation(); //操作  
  127.     }  
  128.   
  129.     delete work;  
  130.   
  131.     return 0;  
  132. }  

二. 状态模式

定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

结构图:


使用范围:

(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(上面的例子就是这种情况)

(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。


转自:http://blog.csdn.net/lwbeyond/article/details/7572267

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值