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


    一. 举例

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

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

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

    结构图如下:

    代码如下:
    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)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

  • 相关阅读:
    webpack篇
    js 中对于this 的理解的 经典案例
    AMD、CMD、CommonJs和es6对比
    vue import异步加载js
    vscode 保存自动 格式化eslint 代码
    git设置
    面向对象的三大特性之继承
    面向对象 类与对象及其属性与方法 类的组合
    hashlib模块 hash算法
    configparser模块 配置文件的解析操作
  • 原文地址:https://www.cnblogs.com/any91/p/3248004.html
Copyright © 2020-2023  润新知