设计模式——状态模式

来源:互联网 发布:家用灭蚊 知乎 编辑:程序博客网 时间:2024/05/20 12:49

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。本文的例子为第一种情况,以战争为例,假设一场战争需经历四个阶段:前期、中期、后期、结束。当战争处于不同的阶段,战争的行为是不一样的,也就说战争的行为取决于所处的阶段,而且随着时间的推进是动态变化的。下面给出相应的UML图。


       实现的代码比较简单,给出War类和State类,War类中含State对象(指针形式)。

[cpp] view plaincopyprint?
  1. class War;  
  2. class State   
  3. {  
  4. public:  
  5.     virtual void Prophase() {}  
  6.     virtual void Metaphase() {}  
  7.     virtual void Anaphase() {}  
  8.     virtual void End() {}  
  9.     virtual void CurrentState(War *war) {}  
  10. };  
  11. //战争  
  12. class War  
  13. {  
  14. private:  
  15.     State *m_state;  //目前状态  
  16.     int m_days;      //战争持续时间  
  17. public:  
  18.     War(State *state): m_state(state), m_days(0) {}  
  19.     ~War() { delete m_state; }  
  20.     int GetDays() { return m_days; }  
  21.     void SetDays(int days) { m_days = days; }  
  22.     void SetState(State *state) { delete m_state; m_state = state; }  
  23.     void GetState() { m_state->CurrentState(this); }  
  24. };  

           给出具体的状态类:

[cpp] view plaincopyprint?
  1. //战争结束  
  2. class EndState: public State  
  3. {  
  4. public:  
  5.     void End(War *war) //结束阶段的具体行为  
  6.     {  
  7.         cout<<"战争结束"<<endl;  
  8.     }  
  9.     void CurrentState(War *war) { End(war); }  
  10. };  
  11. //后期  
  12. class AnaphaseState: public State  
  13. {  
  14. public:  
  15.     void Anaphase(War *war) //后期的具体行为  
  16.     {  
  17.         if(war->GetDays() < 30)  
  18.             cout<<"第"<<war->GetDays()<<"天:战争后期,双方拼死一搏"<<endl;  
  19.         else  
  20.         {  
  21.             war->SetState(new EndState());  
  22.             war->GetState();  
  23.         }  
  24.     }  
  25.     void CurrentState(War *war) { Anaphase(war); }  
  26. };  
  27. //中期  
  28. class MetaphaseState: public State  
  29. {  
  30. public:  
  31.     void Metaphase(War *war) //中期的具体行为  
  32.     {  
  33.         if(war->GetDays() < 20)  
  34.             cout<<"第"<<war->GetDays()<<"天:战争中期,进入相持阶段,双发各有损耗"<<endl;  
  35.         else  
  36.         {  
  37.             war->SetState(new AnaphaseState());  
  38.             war->GetState();  
  39.         }  
  40.     }  
  41.     void CurrentState(War *war) { Metaphase(war); }  
  42. };  
  43. //前期  
  44. class ProphaseState: public State  
  45. {  
  46. public:  
  47.     void Prophase(War *war)  //前期的具体行为  
  48.     {  
  49.         if(war->GetDays() < 10)  
  50.             cout<<"第"<<war->GetDays()<<"天:战争初期,双方你来我往,互相试探对方"<<endl;  
  51.         else  
  52.         {  
  53.             war->SetState(new MetaphaseState());  
  54.             war->GetState();  
  55.         }  
  56.     }  
  57.     void CurrentState(War *war) { Prophase(war); }  
  58. };  
         使用方式:

[cpp] view plaincopyprint?
  1. //测试案例  
  2. int main()  
  3. {  
  4.     War *war = new War(new ProphaseState());  
  5.     for(int i = 1; i < 40;i += 5)  
  6.     {  
  7.         war->SetDays(i);  
  8.         war->GetState();  
  9.     }  
  10.     delete war;  
  11.     return 0;  
  12. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 气炉子打不着火怎么办 下面人员不参加公司拓展怎么办 重点班的差生怎么办 江苏考生选修考d怎么办 眼睛里有虫子该怎么办 屋里毛絮特别多怎么办 信用卡人员核核查单位地址怎么办 红米note电源键失灵怎么办 红米note4x跳屏怎么办 红米开机键坏了怎么办 红米note2开关键不灵敏怎么办 大学生论文检测系统忘记密码怎么办 快手实验室没有k歌怎么办 皮肤一到冬天就会起皮脱落怎么办 嘴上的皮撕破了怎么办 身体皮肤干燥起皮怎么办 把公司数据库弄宕机了怎么办 地铁上临时变站怎么办 大学实践课挂了怎么办 军训的人长得矮怎么办 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办 被蝎子蛰了怎么办怎么处理? 月嫂走了孩子闹怎么办 转业军人自建房有困难怎么办 转业军人没配偶想异地安置怎么办 转业军人档案和身份证不符怎么办 转业军人个人资被单位遗失怎么办 空军飞行学员停飞后怎么办