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 ...
随机推荐
- 腾讯WeTest加入智慧零售“倍增计划”,引领微信小程序质量优化
WeTest 导读 在2019腾讯全球数字生态大会零售分论坛上,腾讯正式面向全行业合作伙伴发布倍增计划,通过咨询.培训.竞赛三步走,帮助零售商户解决前端触点融通的问题,推动微信生意大盘阶梯式上涨. 倍 ...
- 深入Java源码剖析之Set集合
Java的集合类由Collection接口和Map接口派生,其中: List代表有序集合,元素有序且可重复 Set代表无序集合,元素无序且不可重复 Map集合存储键值对 那么本篇文章将从源码角度讨论一 ...
- 解决jmeter进行分布式测试,远程机器来运行脚本,在察看结果树中的响应数据项为空白
下面为大家提供一个解决办法: 第一步:打开主控机的jmeter--bin目录下的jmeter.properties文件 第二步:查找到mode=Standard 项 第三步:将其前边的注释去掉,然后保 ...
- day06 作业
猜年龄游戏 ''' 1. 给定年龄,用户可以猜三次年龄 2. 年龄猜对,让用户选择两次奖励 3. 用户选择两次奖励后可以退出 ''' import random age = random.randin ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- Linux /proc/$pid部分内容详解【转】
转自:https://www.cnblogs.com/likui360/p/6181927.html auxv /proc/[pid]/auxv包含传递给进程的ELF解释器信息,格式是每一项都是一个u ...
- 01-MySQL 大纲介绍
MySQL 大纲介绍 1.官方定义的MySQL DBA工作内容 (1)运维DBA 初级:各版本.各平台安装搭建.升级 中级:体系结构原理.基础管理(启动关闭.初始化配置文件管理.多实例管理.用户权限管 ...
- 15、iptables详解
-- http://www.netfilter.org/ http://www.iptables.org/ --参考路径 http://www.netfilter.org/docume ...
- jenkins使用小技巧:jenkins构建出来的war/jar包如何带上SVN号?
在实际使用过程中,一般会这样比如说打出来的包是 mypackage.jar, 但是每次打出来都是固定的 mypackage.jar如何来区分和上一个包的区别呢? 一般来说,会把打出来的包带上个 svn ...
- 为什么tcp的TIME_WAIT状态要维持2MSL
本文主要分析为什么TIME_WAIT状态的持续时间是2MSL而不是1MSL,3MSL或其它的时长,而不会详细描述为什么需要TIME_WAIT状态. 阅读本文需要的预备知识: 了解TCP协议的状态变迁: ...