软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍状态模式的实现。

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(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. }

本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

设计模式C++实现 ——状态模式相关推荐

  1. 【游戏设计模式】之三 状态模式、有限状态机

    转载自:https://blog.csdn.net/poem_qianmo/article/details/52824776 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if e ...

  2. 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅 ...

  3. 【游戏设计模式】之三 状态模式 有限状态机 Unity版本实现

     本系列文章由@浅墨_毛星云 出品,转载请注明出处.    文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776  作者:毛星 ...

  4. 设计模式之略见一斑(状态模式State)

    设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱.从而使系统难以维护,所以State模式的意图就是将与状态有关的处 ...

  5. 设计模式学习笔记-状态模式

    引言 使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换.有一个明确的状态划分的情况下,此时,是可以使用Switch...case. ...

  6. c语言lr分析器的设计与实现_Python3设计模式四 :状态模式

    状态(state)模式在实现上类似于策略模式,但是它们的目标非常的不同.状态模式呈现的是一个状态转换系统:系统中的对象处在一个特定的状态当中,经过某些操作之后可以抵达另外的状态. 为了实现这一目标,需 ...

  7. 从王者荣耀看设计模式(六.状态模式)

    从王者荣耀看设计模式(状态模式) 一.简介 英雄项羽在敌方英雄的攻击下存在3种不同的状态. 1.在健康生命值下--普通状态,在每次被攻击时,当前生命值=剩余生命值-敌方英雄伤害值 2.在生命值低于某一 ...

  8. 设计模式:(状态模式)

    1.定义 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 co ...

  9. 设计模式之 State(状态模式)通俗理解

    23种设计模式 1 State 模式的定义 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 2 何时使用? 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了它的类.状态模式 ...

最新文章

  1. 【剑指offer-Java版】46求 1 + 2 + 3 + ... + n
  2. Boost之timer库
  3. echat 图表动态数据生成,渲染,自定义Y轴坐标值
  4. 设置状态栏和标题栏的样式
  5. window的war发布Linux失败,为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?...
  6. ADO编程中ATL所遇到的定义问题
  7. 请问android直接post请求登录地址成功后,webview还是现实登录界面
  8. 线性dp——cf988F
  9. vuex的基础小案例(黑马教程)
  10. 蓝阔无线打印服务器设置,蓝阔打印服务器远程打印
  11. jQuery正则表达式实现表单验证功能(注册)
  12. 人人商城小程序消息服务器配置,人人商城小程序订阅消息设置方法绝对好使
  13. 利用css3伪元素实现加号、减号、对号小图标效果
  14. 01 Conv-TasNet论文分享
  15. Idea 设置Eclipse快捷键
  16. Web前端基础体验学习过程1 HTML篇
  17. “将就的人生,其实沉没成本非常高”
  18. JAVA版B2B2C商城源码 拼团商城 分销商城 springboot商城多商家入驻商城系统
  19. QQ群设置里的“不提示消息只显示数目”与“接收不提示消息”的区别
  20. Python错误集锦:matplotlib legend提示:ValueError: Unrecognized location ‘upper’. Valid locations are

热门文章

  1. java socket 浏览器_Socket实现Java和浏览器交互。
  2. 包装类转换基本数据类型与基本数据类型转换为包装类
  3. 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
  4. python中cursor操作数据库(转)
  5. Spring Security在标准登录表单中添加一个额外的字段
  6. Mybatis入门---一对多、多对多
  7. 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
  8. python第三方库-基础
  9. 【02】koala编译中文出错(已放弃不用)
  10. JQuery中的Deferred-详解和使用