设计模式C++实现 ——状态模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】正确认识动脉压力波形

转自&#xff1a;https://www.sohu.com/a/288192545_377325 前言 早在50多年前&#xff0c;就已经在麻醉患者中开始进行直接动脉血压监测。尽管对动脉压力波形的形态和细节进行分析可以给我们提供一些有用的诊断信息&#xff0c;但现代的医生似乎很少关注它。临床实践中的这些…

2008服务器ftp上传文件,win2008怎么开通服务器ftp上传

win2008怎么开通服务器ftp上传 内容精选换一换GPU加速型实例如需使用OpenGL/DirectX/Vulcan等图形加速能力则需要安装GRID驱动并自行购买和配置使用GRID License。此外&#xff0c;GRID驱动配合vDWS类型License&#xff0c;也支持CUDA&#xff0c;用来满足既需要计算加速也需要…

【转】DICOM中几个判断图像方向的tag

转自&#xff1a;https://www.cnblogs.com/h2zZhou/p/9072967.html 在DICOM标准里&#xff0c;有三个TAG与成像的方向相关。 参考来源&#xff1a;Kitware关于DICOM方向的说明 http://public.kitware.com/IGSTKWIKI/index.php/DICOM_data_orientation 包括 1、Image Positi…

学习 SQL 语句 - Select(4): 排序

Order By Asc|Desc本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ADODB;typeTForm1 class(TForm)DBGrid1: TDBGrid;DataSource1: TDataSource;…

【转】Ubuntu 16.04 远程桌面

转自&#xff1a;实现Windows直接远程访问Ubuntu 18.04&#xff08;旧版本也支持,无需安装第三方桌面,直接使用自带远程工具&#xff09; - 法号阿兴 - 博客园 一、设置Ubuntu 16.04 允许进行远程控制 首先&#xff0c;我们先设置Ubuntu的远程控制&#xff0c;将其设置为允许被…

GridView应用整理

2009年5月31日下午 21:58:38 获取GridView中RowCommand的当前选中行索引 <asp:GridView ID"BookGridView" runat"server"><Columns><asp:BoundField DataField"id" HeaderText"图书编号" /><asp:BoundField Data…

【转】Ubuntu下使用sysv-rc-conf管理服务

转自&#xff1a;https://www.linuxidc.com/Linux/2016-11/136834.htm sysv-rc-conf简介 sysv-rc-conf是一个强大的服务管理程序&#xff0c;群众的意见是sysv-rc-conf比chkconfig、rcconf好用。 背景知识 Ubuntu运行级别 Linux 系统任何时候都运行在一个指定的运行级上&…

【转】How to install VNC server on ubuntu 14.04

转自&#xff1a;https://www.krizna.com/ubuntu/install-vnc-server-ubuntu-14-04/ VNC server is used to share graphical desktop which can be controlled from other computers . This guide is helpful to install VNC server on Ubuntu Desktop 14.04, Ubuntu server …

Nsis 使用1-- 依条件显示自定义页面 custom page on condition

在制作安装程序的时候&#xff0c;我们会经常遇到根据用户的不同选择而随后显示不同的安装信息采集页面。 其实很简单&#xff0c;在使用NSIS的时候发现了这么个方法&#xff0c;记下来防止自己忘记哈&#xff1a;Code; MUI 2 compatible ------!include "MUI2.nsh"!…

WINCE6.0操作系统---内核(kernel)学习

备注&#xff1a;这里的内核指kernel&#xff0c;其表现形式为kernel.dll&#xff0c;OS指操作系统&#xff0c;core指核心。 图1 WINCE6.0体系结构 1. kernel的组成和功能 WINCE6.0操作系统内(kernel)在代码中的表现形式是kernel.dll(也就是kern.dll)&#xff0c; WINCE5…

WINCE6.0体系结构学习

WINCE6.0的体系结构图如下图所示&#xff1a; 图1 WINCE的体系结构 根据上图可以把WINCE6.0体系结构分为硬件层、OEM层、操作系统层和应用层&#xff0c;这四层紧密合作&#xff0c;相互配合来完成从应用程序的调用到对硬件的操作和交互。 1. 硬件层 硬件平台的核心是嵌入…

【转】深度理解C# 的执行原理

转自&#xff1a;https://zhuanlan.zhihu.com/p/47177008 从编译原理说起虚拟机是什么C# 是什么&#xff0c;IL 又是什么.Net Framework vs MonoUnity3D 中的 C#小结作者&#xff1a;易立 | 腾讯IEG高级工程师为什么 Unity3D 可以运行 C#&#xff0c;C# 和 Mono 是什么关系&am…

Java程序员的推荐阅读书籍

作为Java程序员来说&#xff0c;最痛苦的事情莫过于可以选择的范围太广&#xff0c;可以读的书太多&#xff0c;往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些&#xff0c;按照学习的先后顺序&#xff0c;推荐给大家&#xff0c;特别是那些想不断提高自己技术水…

【转】Win10系统创建WiFi热点的两种方法

现在电脑和wifi已经成为很多人生活中不可缺少的一部分&#xff0c;上网过程只有连接WiFi才可以上网。使用windows10系统开启WiFi热点都是提示没有找到支持的无线网卡。不管你是驱动更新&#xff0c;重装&#xff0c;还是怎么操作都是不能用。为此&#xff0c;大家不妨参考下文方…

【转】Win10系统怎么设置无线做AP热点_win10设置无线为ap热点的步骤

转自&#xff1a;http://www.win7zhijia.cn/win10jc/win10_33126.html 在win10系统中&#xff0c;默认情况下无线网卡大部分都用于STA模式&#xff0c;但是有时候需要将无线网卡的工作模式为SoftAP&#xff0c;这样如果有双网卡的话&#xff0c;就能够将本机网络共享给其他PC或…

虚析构函数解析

C 指出&#xff1a;当一个派生类对象通过使用一个基类指针删除&#xff0c;而这个基类有一个非虚的析构函数&#xff0c;则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。如果一个类要被另外一个类继承&#xff0c;而且用其指针指向其子类对象时&#…

【转】wifi的几种工作模式

转自&#xff1a;https://www.cnblogs.com/Ph-one/p/12455362.html https://www.cnblogs.com/jpzhu/p/11983992.html WIFI配置具体的模式主要有以下这几种&#xff1a;STA模式、AccessPoint模式、Monitor模式、Ad-hoc&#xff08;IBSS&#xff09;模式、WDS模式、Mesh模式。 …

【转】WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍

转自&#xff1a;https://www.cnblogs.com/yuanqiangfei/p/11674640.html 不知道大家对无线同屏技术有多少了解&#xff0c;当这种技术普及的时候&#xff0c;我想我们的工作与生活又会方便很多吧&#xff01;下面是目前三种主流同屏技术的介绍&#xff1a; 目前这种将终端信…

[轉]C# 中的委托和事件

轉自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.htmlpdf:http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdfC# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛&#xff0c;然而&#xff0c;较好地理解委托和事件…

【转】解决MeasureString 不准确的问题

转自&#xff1a;https://www.cnblogs.com/MRRAOBX/articles/7473803.html 我在将字符串(含中文)Draw到一幅图片上时发现不准这个问题的。 比如一幅图片的宽是400pixel,Graphics对象g的GraphicUnit是Pixel&#xff0c;我要画到图上的字符串是str,我用g.MeasureString(str.Sub…