04、状态模式(State)
一、概念:
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。【DP】
二、作用:
状态模式的主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。吧状态的判断逻辑转移到表示不同状态的一系列当中,
可以把复杂的判断逻辑简化。当然如果这个状态的判断很简单,那么就没必要用“状态模式”了,千万注意不要为了设计模式而去用设计模式。
三、通俗的概念理解:
就是为了消除庞大的条件分支语句。当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了。
四、状态模式类图;

五、对概念的理解和针对类图进行代码的开展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace State
{
//State类,抽象状态类,定义一个接口一封装与Context的一个特定状态相关的行为
public abstract class State
{
public abstract void Handle(Context context);
} //ConcreteState类,具体状态类,每一个子类实现一个与Context的一个状态相关的行为
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB(); //设置ConcreStateA的下一状态是ConcreStateB
}
} public class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA(); //设置ConcreStateB的下一状态是ConcreStateA
}
} //Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态
public class Context
{
private State state;
public State State
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态:" + state.GetType().Name);
}
} public Context(State state) //定义Context的初始状态
{
this.state = state;
} public void Request()
{
state.Handle(this); //对请求做处理,并设置下一状态
} } class Program
{
//客户端代码;
static void Main(string[] args)
{
Context context = new Context(new ConcreteStateA()); //设置Context的初始状态为ConcreStateA context.Request();
context.Request();
context.Request();
context.Request();
Console.ReadKey(); }
}
}
结果显示

六、接下啦就是对概念进行实例的操作了,概念记得再熟,也不如实战一把
这里就是以程序员的加班来进行案例的解释了,对一天的工作时间与下班来进行一个状态的切换。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Test_02
{ //抽象的状态
public abstract class State
{
public abstract void WriteProgram(Work work);
} //上午的工作状态
public class ForenoonState : State
{
public override void WriteProgram(Work work)
{
if (work.Hour < )
{
Console.WriteLine("当前时间:" + work.Hour + "点,上午工作,精神还行");
}
else //否则,超过12点进行状态的切换
{
work.SetState(new NoonState());
work.WriteProgram();
}
}
} //中午的工作状态
public class NoonState : State
{
public override void WriteProgram(Work work)
{
if (work.Hour < )
{
Console.WriteLine("当前时间:" + work.Hour + "点,中午,饿了,犯困");
}
else //转到下午的工作状态
{
work.SetState(new AfternoonState());
work.WriteProgram();
} }
} public class AfternoonState : State
{
public override void WriteProgram(Work work)
{
if (work.Hour < )
{
Console.WriteLine("当前时间:" + work.Hour + "点,下午状态还不错,继续努力");
}
else//否则,转为傍晚的工作状态
{
work.SetState(new EveningState());
work.WriteProgram();
} }
}
//晚间工作状态
public class EveningState : State
{
public override void WriteProgram(Work work)
{
if (work.Finish == true) //当工作完成了,则转入下班的装态
{
work.SetState(new RestState());
work.WriteProgram();
}
else
{
if (work.Hour < )
{
Console.WriteLine("当前时间:" + work.Hour + "点,加班哦,疲累至极");
}
else //当时间超过21点则转入睡觉的状态
{
work.SetState(new SleepState());
work.WriteProgram();
}
}
}
}
//睡眠状态
public class SleepState : State
{
public override void WriteProgram(Work work)
{
Console.WriteLine("当前时间:" + work.Hour + "点,已经撑不住了,睡着了");
}
} //下班休息状态
public class RestState : State
{
public override void WriteProgram(Work work)
{
Console.WriteLine("当前时间:" + work.Hour + "点,下吧回家休息了");
}
} //工作类
public class Work
{
private State current;
public Work()
{
current = new ForenoonState();//工作的初始状态为上午工作状太,9点开始工作
}
private double hour; //属性,状态切换的依据 public double Hour
{
get { return hour; }
set
{
hour = value;
}
} private bool finish = false; //任务完成标志,是否能下班的标志 public bool Finish
{
get { return finish; }
set { finish = value; }
} public void SetState(State state)
{
current = state;
} public void WriteProgram()
{
current.WriteProgram(this);
} }
class Program
{
static void Main(string[] args)
{
Work work = new Work();
work.Hour = ;
work.WriteProgram();
Console.ReadKey();
}
}
}
七、总结:
当一个对象的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,就可以考虑使用状态模式了,
例如可以在角色的AI切换的时候使用,在游戏界面的登录界面以及其他界面的切换中使用,
八:扩充:
在写代码的时候,一定要避免在一个类中的方法过于太长了的情况发生,看起来也是不太舒服的!
2017-12-14 00:27:06
04、状态模式(State)的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 状态模式-State Pattern(Java实现)
状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 状态模式(State)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- 设计模式 笔记 状态模式 State
//---------------------------15/04/28---------------------------- //State 状态模式----对象行为型模式 /* 1:意图: ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
随机推荐
- BUUCTF 随便注
知识点: ##堆叠注入 #预语句注入 https://www.cnblogs.com/0nth3way/articles/7128189.html#autoid-1-0-0 正则过滤了很多关键字导致无 ...
- maven 学习---POM机制
POM 代表工程对象模型.它是使用 Maven 工作时的基本组建,是一个 xml 文件.它被放在工程根目录下,文件命名为 pom.xml. POM 包含了关于工程和各种配置细节的信息,Maven 使用 ...
- net core 2 读取appsettings.json
问: .Net Core: Application startup exception: System.IO.FileNotFoundException: The configuration file ...
- django使用xadmin
一.安装xadmin 由于我用的是Django2.0以后的版本 所以无法直接通过pip install xadmin来安装 即使安装成功了 也会报乱七八糟的错误 https://github.com/ ...
- 07webpack--下载对应的css模块
<!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...
- 精通awk系列
安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的 ...
- 杂项-FLAG
题目 最低位隐写 50 4B 03 04 压缩格式zip的文件头 save bin 保存成zip格式 解压(WinRAR不能正常解压) 然后用vim打开(winhex也可以) hctf{dd0gf4c ...
- csp 201409-3 字符串匹配
问题描述: 很简单,判断给定串是否在目标串中出现.分区分大小写和不区分大小写两种情况. csp特点: csp的第三题一般是字符串的处理,c++的string类虽然不好用,但是掌握的话在考试的时候可能能 ...
- Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级。
升级前 => 升级后 Spring Boot 1.5.x => Spring Boot 2.0.2 Spring Cloud Edgware SR4 => Spring Cloud ...
- js toFixed() 四舍五入后并不是你期望的结果
小学的时候学数学就知道有一种叫四舍五入的计算方式,就是对于小数位数的取舍,逢五进一,比如1.225 取两位小数后就是1.23.在前端开发中自己也少不了这样的计算,js也提供了相关的方法--toFixe ...