状态模式(State)
状态模式,从字面意思上来讲应该是很简单的,就是针对实际业务上的内容,当类的内部的状态发生改变时,给出不同的响应体,就像现实中的人一样,早上没有吃饭,状态不好,上班、上课都会打哈欠,中午了,吃过午饭,又吃太饱了,又有点困意了,到了晚上了,终于下班了,可以好好放松一下了,出去好好耍一耍,针对不同的时间有不同的状态,那么怎么在程序中实现呢,让其在不同的状态下给出不同的响应,使其状态发生改变后行为也发生改变。
这里我们就可以使用状态模式来实现这种实际存在的问题。
当一个类的状态发生改变时,伴随着类的行为发生了改变,这样就看起来是类发生了改变,这样的使用就是状态模式,那状态模式使用的场景又是什么呢?一般用于当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同的一系列类当中,可以把负责的逻辑判断简单化。
模式中使用到的角色主要包含了上下文环境(它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理)、抽象状态(定义一个接口以封装使用上下文环境的的一个特定状态相关的行为)、具体状态(实现抽象状态定义的接口)。
下面我们简单地看一下其的UML图:

具体的代码实现如下:
1、抽象状态类:
namespace StateDemo
{
public abstract class State
{
public abstract void Handle(Context context);
}
}
State
2、具体状态类:
namespace StateDemo
{
public class ConcreteStateA:State
{
public override void Handle(Context context)
{
Console.WriteLine("当前状态为A,触发与A相关的场景");
context.State = new ConcreteStateB();
}
}
}
ConcreteStateA
namespace StateDemo
{
public class ConcreteStateB:State
{
public override void Handle(Context context)
{
Console.WriteLine("当前状态为B,触发与B相关的场景");
context.State = new ConcreteStateA();
}
}
}
ConcreteStateB
3、上下文环境:
namespace StateDemo
{
public class Context
{
private State _state { set; get; }
public State State
{
set { this._state = value; }
get { return this._state; }
} public Context(State state)
{
this._state = state;
} public void Request()
{
this._state.Handle(this);
}
}
}
Context
4、Main方法:
namespace StateDemo
{
class Program
{
static void Main(string[] args)
{
Context context = new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
Console.ReadKey();
}
}
}
Main
以上是对状态模式的简单介绍,其使用场景是: 当一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。
本篇文章状态模式至此,谢谢您收看我的博客。
状态模式(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)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- 状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...
随机推荐
- 程序集、应用程序配置及App.config和YourSoft.exe.config .
转自:http://www.cnblogs.com/luminji/archive/2010/10/21/1857339.html 什么是程序集 程序集标识属性 强名称的程序集 强名称工作原理 配置文 ...
- RosettaNet
RosettaNet 这一名字源自于 1799 年在埃及发现的 Rosetta Stone .这要追溯到公元前 196 年,该石头是在 Rosetta (Rashid) 镇附近被人发现的,上面用两种不 ...
- tachyon 编译
最新版 tachyon0.5.0 的 binary 包默认使用JDK1.6 和 hadoop 1.0.4 自己的环境是1.7 和 2.2.0,所以重新编译 1.下载源码 https://github. ...
- [Windows] 解决kmplayer播放rmvb文件音视不同步
1. 到該帖子 http://www.kmplayer.com/forums/showthread.php?t=8755 下載附件中的4個檔案放到KMP 根 目錄下(此文件已在附件中上传) 2.於KM ...
- Java Script基础(八) Array数组对象
一.Array数组 JavaScript中的数组也是具有相同数据类型的一个或者多个值得集合.用法和Java中的数组类似. Array对象的常用属性和方法: 属性: length:获取数组的长度: 方法 ...
- (转)Linux IO模式及 select、poll、epoll详解
本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么 ...
- React Native学习-控制横竖屏第三方组件:react-native-orientation
在项目中,有时候可能会想使不同的页面显示的横竖屏也不一样,比如前一段我做的<广播体操>的项目,在首页面,肯定是想使页面为竖屏显示,但是播放页面要为横屏显示,即使用户的手机可以转屏,我们的播 ...
- React Native视频播放(iOS)
网站链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learn-react-native-video/ React Nativ ...
- POJ 2421 Constructing Roads (最小生成树)
Constructing Roads Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...