有学过物理课的同学都知道物理课本里面有固态,液态,气态,用来描述物体的形态。但在面向对象的软件世界中,状态可以用来描述各种各样的对象。比如你想在淘宝买一个商品,此时商品肯定是在售状态,如果这个商品已经售完;如果这个商品已经被买家购买一空,那么商品变成了售空状态;如果中途这个商品被发现质量有问题,于是变成了下架状态。当然真正的商品状态肯定不止这些,这里只是举了些例。
网络上有把状态模式说成是策略模式的孪生兄弟。从实现角度来讲他们确实非常类似。但它们的应用场景却略有不同。
我想接着上一节策略模式的例子,继续用魔兽世界这款游戏来讲解状态模式和策略模式的区别。
组队模式已经在策略模式篇中有详细介绍。
游戏设计者很聪明的选择了队长选定难度的方式来决定进入哪个地下城。把选择权交给玩家是典型的策略模式的应用场景。
让我们来给设计者们增加一些难度。假设说游戏里并没有队长选定难度的方法,而是根据玩家队伍里的人数来决定进入哪个地下城。游戏设计者们该如何设计这种方式呢?下面的图说明了这种方式的不同。可以明显地看到这两种方式的区别,此种方式选择权已经不在队长手上。
那么,如果说还需要增加难度,则会如下图所示。
如果把人数的变化看成队伍状态的一种变化,合格的设计者会提前定义出针对每种状态的算法。
比如: 队伍人数10人或以下 状态一
队伍人数10人以上至25人 状态二
队伍人数25人以上至40人 状态三
针对每种状态的算法,如下图所示。
这样做的好处是如果以后要加入60人(状态四)或者80人(状态五)的地下城,程序的结构会非常清晰。
上面的结构其实就是状态模式的典型应用,当然到这里还没有结束。可以从上图看到状态模式和策略模式在实现上何其类似。
我想用伪代码的形式来说明状态模式的应用,分为不使用模式和使用模式:
1、应用状态模式之前,看到的应该是这样的逻辑:
//如果队伍人数在10人或以下
//初始化10人地下城
//如果队伍人数在10人以上至25人
//初始化25人地下城
.....
2、应用状态模式之后,看到的应该是这样的逻辑:
//根据玩家人数初始化对应的地下城(统一入口)
不使用模式的做法在算法不是非常多的情况下非常适合。套用程序员的白话讲就是把代码逻辑写死。
但第二种更灵活,并且很方便扩展。因为人数是动态的,状态模式带来的好处是明显的,就是在程序运行时动态地替换算法。而不用把代码写死。
以上的表述和策略模式基本相同,从一个侧面也证明了状态模式和策略模式的相似之处。
关于如何用代码实现状态模式,网上有很多文章,使了用各种语言,不管是C++,C#,Java还是动态语言来说明和讲解。都讲的很多,这里就不再重复。
总结一下状态模式的使用,大体实现都是两步:
第一步:针对每种状态抽象各自的算法。使各算法可以互不影响。
第二步:提供统一入口。用于根据指定状态来替换算法。
最后来总结一下状态模式和策略模式的区别:
1、策略模式把选择权交给了玩家,而状态模式则封闭选择权。
2、策略模式是根据不同的选择选取对应的算法,而状态模式是根据状态的变化来选取对应的算法。
确实,可以把状态模式看成是一种自我封闭的策略模式。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
电子书下载 : http://blog.csdn.net/good3651/article/details/53420721 -------阅读完本书,您将学会如何对魔兽世界界面进行自定义修改。如果您初学编程,将从本书学习到Lua和XML的基础知识,以及如何开始编写自己...
魔兽世界网站WoWFailureCMS
魔兽世界全部API接口,帮忙制作WOW小工具,宏必备资料
魔兽世界HTML模板 魔兽世界模板 网络游戏模板 HTML模板 网页界面设计 网络宣传模板
C# 开发的魔兽世界服务端模拟器源代码,仅供学习参考,对魔兽服务器感兴趣的朋友有福了。
魔兽世界CSS网页模板 红色 商务 网页 模板 游戏 魔兽 官网 商业 公司 设计 主页 HTML DIV+CSS 模板下载
内容概要:魔兽世界提取工具CASCExplorer 适合人群:需要得到魔兽世界资源文件的用户 可以做什么:可以提取模型、音效、资源,支持怀旧服 燃烧的远征 TBC WLK 使用建议: 运行的时候杀毒软件会检测为木马程序,需要...
C#写的魔兽世界登录器
魔兽世界图标大全,各式技能图片,装备图片,等等等等,应有尽有,走过路过不要错过
DirectX版本的WOW魔兽世界游戏客户端源码.zip
魔兽世界数据库 翻译工具 针对mangos服务器
魔兽世界MANGOS数据库分析
魔兽世界超级炉石,涵盖传送、武器等级满、消除负面状态、重置天赋等功能
开源的魔兽世界参考架构,分析了当下魔兽世界的服务器架构后,利用提供的开源服务器框架mangos来搭建属于自己的魔兽世界服务器!
魔兽世界单机的数据库的表名注释,数据库的注释 玩单机的人用的
该资源是中国大学MOOC网站上北京大学开设的《C++程序设计与算法-3》的最终大作业,博主在倍速看完后,使用QT完全由自己编写而成。由于考虑到程序的整体架构清晰明白,分了好几个类文件,后来看了网上其他同学的代码...
魔兽 世界 TBC 怀旧服 防离线 跳跳 可隐藏窗口 C++ MFC 大湿兄作品!游戏自动跳跳防AFK 支持 自动按空格 取消 隐藏以及显示游戏。方便在公司玩。支持最小化到托盘 魔兽世界防AFK掉线
魔兽世界lua插件开发教程
大芒果_魔兽世界_mysql_数据库_详解.docx