状态模式(State)
一、概念:
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。【DP】
二、作用:
状态模式的主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
吧状态的判断逻辑转移到表示不同状态的一系列当中,可以把复杂的判断逻辑简化。
当然如果这个状态的判断很简单,那么就没必要用“状态模式”了,千万注意不要为了设计模式而去用设计模式。
三、通俗的概念理解:
就是为了消除庞大的条件分支语句。当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了。
四、状态模式类图;
五、对概念的理解和针对类图进行代码的翻译;
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace State 8 { 9 //State类,抽象状态类,定义一个接口一封装与Context的一个特定状态相关的行为 10 public abstract class State 11 { 12 public abstract void Handle(Context context); 13 } 14 15 //ConcreteState类,具体状态类,每一个子类实现一个与Context的一个状态相关的行为 16 public class ConcreteStateA : State 17 { 18 public override void Handle(Context context) 19 { 20 context.State = new ConcreteStateB(); //设置ConcreStateA的下一状态是ConcreStateB 21 } 22 } 23 24 public class ConcreteStateB : State 25 { 26 public override void Handle(Context context) 27 { 28 context.State = new ConcreteStateA(); //设置ConcreStateB的下一状态是ConcreStateA 29 } 30 } 31 32 //Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态 33 public class Context 34 { 35 private State state; 36 public State State 37 { 38 get { return state; } 39 set 40 { 41 state = value; 42 Console.WriteLine("当前状态:" + state.GetType().Name); 43 } 44 } 45 46 public Context(State state) //定义Context的初始状态 47 { 48 this.state = state; 49 } 50 51 public void Request() 52 { 53 state.Handle(this); //对请求做处理,并设置下一状态 54 } 55 56 } 57 58 class Program 59 { 60 //客户端代码; 61 static void Main(string[] args) 62 { 63 Context context = new Context(new ConcreteStateA()); //设置Context的初始状态为ConcreStateA 64 65 context.Request(); 66 context.Request(); 67 context.Request(); 68 context.Request(); 69 Console.ReadKey(); 70 71 } 72 } 73 }
结果显示;
六、接下啦就是对概念进行实例的操作了,概念记得再熟,也不如实战一把,
那我这里就是以程序员的加班来进行案例的解释了,对一天的工作时间与下班来进行一个状态的切换。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Test_02 8 { 9 10 //抽象的状态 11 public abstract class State 12 { 13 public abstract void WriteProgram(Work work); 14 } 15 16 //上午的工作状态 17 public class ForenoonState : State 18 { 19 public override void WriteProgram(Work work) 20 { 21 if (work.Hour < 12) 22 { 23 Console.WriteLine("当前时间:" + work.Hour + "点,上午工作,精神还行"); 24 } 25 else //否则,超过12点进行状态的切换 26 { 27 work.SetState(new NoonState()); 28 work.WriteProgram(); 29 } 30 } 31 } 32 33 //中午的工作状态 34 public class NoonState : State 35 { 36 public override void WriteProgram(Work work) 37 { 38 if (work.Hour < 13) 39 { 40 Console.WriteLine("当前时间:" + work.Hour + "点,中午,饿了,犯困"); 41 } 42 else //转到下午的工作状态 43 { 44 work.SetState(new AfternoonState()); 45 work.WriteProgram(); 46 } 47 48 49 } 50 } 51 52 public class AfternoonState : State 53 { 54 public override void WriteProgram(Work work) 55 { 56 if (work.Hour < 17) 57 { 58 Console.WriteLine("当前时间:" + work.Hour + "点,下午状态还不错,继续努力"); 59 } 60 else//否则,转为傍晚的工作状态 61 { 62 work.SetState(new EveningState()); 63 work.WriteProgram(); 64 } 65 66 } 67 } 68 //晚间工作状态 69 public class EveningState : State 70 { 71 public override void WriteProgram(Work work) 72 { 73 if (work.Finish == true) //当工作完成了,则转入下班的装态 74 { 75 work.SetState(new RestState()); 76 work.WriteProgram(); 77 } 78 else 79 { 80 if (work.Hour < 21) 81 { 82 Console.WriteLine("当前时间:" + work.Hour + "点,加班哦,疲累至极"); 83 } 84 else //当时间超过21点则转入睡觉的状态 85 { 86 work.SetState(new SleepState()); 87 work.WriteProgram(); 88 } 89 } 90 } 91 } 92 //睡眠状态 93 public class SleepState : State 94 { 95 public override void WriteProgram(Work work) 96 { 97 Console.WriteLine("当前时间:" + work.Hour + "点,已经撑不住了,睡着了"); 98 } 99 } 100 101 //下班休息状态 102 public class RestState : State 103 { 104 public override void WriteProgram(Work work) 105 { 106 Console.WriteLine("当前时间:" + work.Hour + "点,下吧回家休息了"); 107 } 108 } 109 110 //工作类 111 public class Work 112 { 113 private State current; 114 public Work() 115 { 116 current = new ForenoonState();//工作的初始状态为上午工作状太,9点开始工作 117 } 118 private double hour; //属性,状态切换的依据 119 120 public double Hour 121 { 122 get { return hour; } 123 set 124 { 125 hour = value; 126 } 127 } 128 129 private bool finish = false; //任务完成标志,是否能下班的标志 130 131 public bool Finish 132 { 133 get { return finish; } 134 set { finish = value; } 135 } 136 137 public void SetState(State state) 138 { 139 current = state; 140 } 141 142 public void WriteProgram() 143 { 144 current.WriteProgram(this); 145 } 146 147 } 148 class Program 149 { 150 static void Main(string[] args) 151 { 152 Work work = new Work(); 153 work.Hour = 19; 154 work.WriteProgram(); 155 Console.ReadKey(); 156 } 157 } 158 }
七、总结:
当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了,
例如可以在角色的AI切换的时候使用,在游戏界面的登录界面以及其他界面的切换中使用,
八:扩充:
在写代码的时候,一定要避免在一个类中的方法过于太长了的情况发生,看起来也是不太爽的是吧!
2017-12-14 00:27:06
转载于:https://www.cnblogs.com/zhh19981104/p/8035691.html
状态模式(State)相关推荐
- php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)
状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...
- c++状态模式state
c++状态模式state 概念 角色和职责 案例 概念 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样 ...
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 状态模式(State)-七十二变
状态模式(State)-老孙七十二变 俺老孙来也-我是如来佛祖玉皇大帝观音菩萨指定取西经特派使者花果山水帘洞美猴王齐天大圣孙悟空啊!老孙的必杀技就是七十二变,没错比老外的变相怪杰还有牛逼许多. 关于老 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...
- 《研磨设计模式》chap18 状态模式state(1)模式简介
场景:投票管理 1. 正常编码 //投票管理 public class VoteManager {//记录用户投票的结果,Map<String,String>对应Map<用户名称,投 ...
- 读书笔记_java设计模式深入研究 第八章 状态模式 State
1,状态模式:事务有n个状态,且维护状态变化. 2,UML模型: -1,上下文环境Context:定义客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete ...
- C++设计模式--状态模式(state)
概述 前面文章介绍了代理模式(在这里),代理模式和状态模式都提供一个代理类,从结构上看,可以认为代理模式只是状态模式的一个特例,不同之处在于,代理模式控制对其实现类的访问,而状态模式动态地改变其实现类 ...
- 设计模式的理解:状态模式(State) 和备忘录模式(Memento)
一.状态模式 状态模式,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类.它的实现方式和策略模式相似,目的都是对if...else语句进行优化,只不过,策略模式通过外部传入枚举.条 ...
最新文章
- NVIDIA安培架构
- 关于ios中编译ffmpeg0.9.2库
- Spring Boot 多版本更新,紧急修复 RFD 安全漏洞
- linux 下安装nginx
- P4332-[SHOI2014]三叉神经树【LCT】
- 51Nod 1085 01背包
- 快速消费品行业的营销费用的管理(3)----营销费用预算管理
- 【Vue2.0】—常用的内置指令(九)
- 安装CUDA时出现黑屏的现象解决办法
- 微波天线及各种天线概念解析
- 企业微信(WeCoom)私有化客户端Api解决方案
- SSM SpringBoot vue教务排课系统
- 虚拟内存页面置换算法c语言,5虚拟内存,页面置换算法
- 可能是世界上最快、最先进的密码恢复程序!
- matlab的四个取整函数!
- 使用ps工具进行图片分析
- 2021年焊工(初级)考试题及焊工(初级)考试报名
- leveldb的sstable-ldb解析
- EBS-自动获取/创建CCID
- 对于工作学习的一些感想