一、概念:

当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。【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)的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  3. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  6. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  7. 状态模式(State)-设计模式

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  8. 设计模式 笔记 状态模式 State

    //---------------------------15/04/28---------------------------- //State  状态模式----对象行为型模式 /* 1:意图: ...

  9. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  10. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

随机推荐

  1. npm 查看全局安装模块

    方法一: npm list -g --depth 0 方法二: 输入npm root -g  得到全局node_modules的地址 在任意文件夹输入此地址,便可查看所安模块 https://blog ...

  2. 如何使 highchart图表标题文字可选择复制

    highchart图表的一个常见问题是不能复制文字 比如官网的某个图表例子,文字不能选择,也无法复制,有时产品会抓狂... 本文给出一个简单的方案,包括一些解决的思路,希望能帮助到有需要的人 初期想了 ...

  3. ubuntu下编译android jni到so库的mk文件配置

    项目根目录下的Android.mk文件 LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional L ...

  4. [PHP] substr占用内存谨慎使用

    在下面的场景中使用substr的时候, 有时候会报超出内存fatal error ,当curl读取的内容过大的时候 $header_size = curl_getinfo($curl_handle, ...

  5. ubuntu 16.04下node和pm2安装

    一.安装node,这里安装9.0的版本,安装其它版本直接到https://deb.nodesource.com/setup_9.x找相应版本的更改既可 1.sudo apt-get remove no ...

  6. 接口测试 从 0 到 1,用 Jmeter 搭建 HTTP 接口自动化引擎 1.0 版本

    百度网盘地址更新:https://pan.baidu.com/s/13S0WStZpwlbL15IBp_Q-bg 1.已实现功能描述 1.1 框架包含:Jenkins.Ant.Jmeter 1.2 测 ...

  7. (day44)css样式、css布局

    目录 一.css样式 (一)文字样式 (1)文字字体font-family (2)字体大小font-size (3)字体粗细font-weight (4)字体颜色color (二)文本样式 (1)文字 ...

  8. 史上最全的CSP-J/S 第一轮知识点

    CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...

  9. VIJOS-P1474 雷曼兔(csapc)

    JDOJ 1532: VIJOS-P1474 雷曼兔(csapc) https://neooj.com/oldoj/problem.php?id=1532 Description 这次,OI山成为了雷 ...

  10. hdu1247-Hat’s Words-(字典树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意:给出一堆单词,求哪些单词是其中某两个单词拼接起来的. 题解:用字典树存储所有的单词,标记结束点,再次 ...