




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
状态 State 模式 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况 把状态的判断逻辑转移到表示不同状态的一系列类当中 可以把复杂的逻辑简化 工作状态 publicclassWork 钟点privateinthour publicintHour get returnhour set hour value 任务完成privateboolfinish false publicboolTaskFinished get returnfinish set finish value publicvoidWriteProgram if hour 12 Console WriteLine 当前时间 0 点上午工作 精神百倍 hour elseif hour 13 Console WriteLine 当前时间 0 点饿了 午饭 犯困 午休 hour elseif hour 17 Console WriteLine 当前时间 0 点下午状态还不错 继续努力 hour else if finish Console WriteLine 当前时间 0 点下班回家了 hour else if hour 21 Console WriteLine 当前时间 0 点加班哦 疲累之极 hour else Console WriteLine 当前时间 0 点不行了 睡着了 hour classProgram staticvoidMain string args 紧急项目WorkemergencyProjects newWork emergencyProjects Hour 9 emergencyProjects WriteProgram emergencyProjects Hour 10 emergencyProjects WriteProgram emergencyProjects Hour 12 emergencyProjects WriteProgram emergencyProjects Hour 13 emergencyProjects WriteProgram emergencyProjects Hour 14 emergencyProjects WriteProgram emergencyProjects Hour 17 emergencyProjects TaskFinished true emergencyProjects TaskFinished false emergencyProjects WriteProgram emergencyProjects Hour 19 emergencyProjects WriteProgram emergencyProjects Hour 22 emergencyProjects WriteProgram Console Read 方法过长是坏味道面向对象设计其实就是希望做到代码的责任分解上例违背了 单一职责原则 开放 封闭原则 状态模式 允许一个对象在其内部状态改变时改变它的行为 这个对象看起来似乎修改了它的类 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况 把状态的判断逻辑转移到表示不同状态的一系列类当中 可以把复杂的逻辑简化 每个人 事物在不同的状态下会有不同表现 动作 而一个状态又会在不同的表现下转移到下一个不同的状态 State 一个生活中的例子 地铁入口处 如果你放入正确的地铁票 门就会打开让你通过 在出口处也是验票 如果正确你就可以OK 否则就不让你通过 有限状态自动机 FSM 也是一个典型的状态不同 对输入有不同的响应 状态转移 通常我们在实现这类系统会使用到很多的Switch Case语句或者If Else语句 Case某种状态 发生某种动作 Case另外一种状态 则发生另外一种动作 但是这种实现方式至少有以下两个问题 当状态数目不是很多的时候 Switch Case可能可以搞定 但是当状态数目很多的时候 实际系统中也正是如此 维护一大组的Switch Case语句将是一件异常困难并且容易出错的事情 状态逻辑和动作实现没有分离 在很多的系统实现中 动作的实现代码直接写在状态的逻辑当中 这带来的后果就是系统的扩展性和维护得不到保证 State模式就是被用来解决上面列出的两个问题的 在State模式中我们将状态逻辑和动作实现进行分离 当一个操作中要维护大量的分支语句 并且这些分支依赖于对象的状态 State模式将每一个分支都封装到独立的类中 State模式典型的结构图为 示例性代码 定义一个接口或抽象类 以封装与Context的一个特定状态相关的行为abstractclassState publicabstractvoidHandle Contextcontext 具体状态 每一个子类实现一个与Context的一个状态相关的行为classConcreteStateA State publicoverridevoidHandle Contextcontext context State newConcreteStateB classConcreteStateB State publicoverridevoidHandle Contextcontext context State newConcreteStateA Context类 classContext privateStatestate publicContext Statestate this state state publicStateState get returnstate set state value Console WriteLine 当前状态 state GetType Name publicvoidRequest state Handle this 客户端 classProgram staticvoidMain string args Contextc newContext newConcreteStateA c Request c Request c Request c Request Console Read 工作状态 状态模式版 工作 Context publicclassWork privateStatecurrent publicWork current newForenoonState privatedoublehour publicdoubleHour get returnhour set hour value privateboolfinish false publicboolTaskFinished get returnfinish set finish value publicvoidSetState States current s publicvoidWriteProgram current WriteProgram this 抽象状态 publicabstractclassState publicabstractvoidWriteProgram Workw 具体状态 publicclassForenoonState State publicoverridevoidWriteProgram Workw if w Hour 12 Console WriteLine 当前时间 0 点上午工作 精神百倍 w Hour else w SetState newNoonState w WriteProgram publicclassNoonState State publicoverridevoidWriteProgram Workw if w Hour 13 Console WriteLine 当前时间 0 点饿了 午饭 犯困 午休 w Hour else w SetState newAfternoonState w WriteProgram publicclassAfternoonState State publicoverridevoidWriteProgram Workw if w Hour 17 Console WriteLine 当前时间 0 点下午状态还不错 继续努力 w Hour else w SetState newEveningState w WriteProgram publicclassEveningState State publicoverridevoidWriteProgram Workw if w TaskFinished w SetState newRestState w WriteProgram else if w Hour 21 Console WriteLine 当前时间 0 点加班哦 疲累之极 w Hour else w SetState newSleepingState w WriteProgram publicclassSleepingState State publicoverridevoidWriteProgram Workw Console WriteLine 当前时间 0 点不行了 睡着了 w Hour publicclassRestState State publicoverridevoidWriteProgram Workw Console WriteLine 当前时间 0 点下班回家了 w Hour classProgram staticvoidMain string args WorkemergencyProjects newWork emergencyProjects Hour 9 emergencyProjects WriteProgram emergencyProjects Hour 10 emergencyProjects WriteProgram emergencyProjects Hour 12 emergencyProjects WriteProgram emergencyProjects Hour 13 emergencyProjects WriteProgram emergencyProjects Hour 14 emergencyProjects WriteProgram emergencyProjects Hour 17 如果要员工必须在20点之前离开公司 只需添加下面的 强制下班状态 并改动EveningState类的判断就可以了emergencyProjects WorkFinished true emergencyProjects TaskFinished false emergencyProjects WriteProgram emergencyProjects Hour 19 emergencyProjects WriteProgram emergencyProjects Hour 22 emergencyProjects WriteProgram Console Read 状态模式优点 将与特定状态相关的行为局部化 并且将不同状态的行为分割开来消除庞大的条件分支语句 把各种状态转移逻辑分布到State的子类之间 减少了相互间的依赖 显式化进行状态转换 为不同的状态引入独立的对象 使得状态的转换变得更加明确 而且状态对象可以保证上下文不会发生内部状态不一致的状况 因为上下文中只有一个变量来记录状态对象 只要为这一个变量赋值就可以了 状态模式缺点 State模式问题主要是逻辑分散化 状态逻辑分布到了很多的State的子类中 很难看到整个的状态逻辑图 这也带来了代码的维护问题 本质 根据状态来分离和选择行为状态模式是状态驱动 由上下文负责 State模式和Strategy模式简单比较 State模式和Strategy模式有很大程度上的相似 它们都有一个Context类 都是通过委托 组合 给一个具有多个派生类的多态基类实现Context的算法逻辑两者最大的差别就是State模式中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租赁商铺押金合同范本(含租赁期限及租金调整)
- 离婚协议书:离婚赔偿金及生活费用保障协议
- 盛芷特殊状况下子女抚养权及赡养费约定书
- 道路安全员考试及答案1
- 智能网联传感器及控制器生产线项目建设工程方案
- 2025年新能源企业客户关系管理优化方案报告
- 普通话知识竞赛题及答案
- 第14课 成长变化(二)教学设计-六年级下册小学美术同步备课资源包(苏少版)
- DB65T 4395-2021 乡村绿化美化技术规范
- 空乘专业考试题及答案
- 小儿抽搐课件
- 锻压机床行业分析报告
- 化工生产工艺培训课件
- 2025一级造价工程师《建设工程造价案例分析》(土木建筑工程、安装工程)考前必背笔记
- 交投面试题目及答案
- 2023年一级建造师《建设工程项目管理》真题及答案解析
- 2025年企业文化企业建设知识竞赛-锦江之星服务知识竞赛历年参考题库含答案解析(5套)
- 2025年全国青少年禁毒知识竞赛试题(附答案)
- 2025年法律基础知识考题库和答案
- 精益生产管理课件
- 集合运算说课课件
评论
0/150
提交评论