设计模式之美:State(状态)
索引
意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
结构

参与者
Context
- 定义客户感兴趣的接口。
- 维护一个 ConcreteState 子类的实例,这个实例定义当前状态。
State
- 定义一个接口以封装与 Context 的一个特定状态相关的额行为。
ConcreteState
- 每一个子类实现一个与 Context 的一个状态相关的行为。
适用性
在以下情况下可以使用 State 模式:
- 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。
效果
- 它将与特定状态相关的行为局部化。
- 它使得状态转换显式化。
- State 对象可被共享。
相关模式
- 使用 Flyweight 模式共享状态对象。
- 使用 Singleton 模式实现状态对象。
实现
实现方式(一):由 ConcreteState 指定它的后继 State。
State 模式不指定哪一个参与者定义状态转换规则。
如果该转换规则是固定的,那么它们可在 Context 中完全实现。
然而若让 State 子类自身指定它们的后继状态以及何时进行转换,通常更为灵活。
这需要 Context 增加一个接口,可以显示地设定 State。
这种实现的缺点是,一个 State 子类至少拥有一个其他子类的信息,使子类间产生了依赖。
namespace StatePattern.Implementation1
{
public abstract class State
{
public abstract string Name { get; }
public abstract void Handle(Context context);
} public class Context
{
private State _state; public Context()
{
} public void SetState(State state)
{
_state = state;
Console.WriteLine("Current State: {0}", _state.Name);
} public void Request()
{
_state.Handle(this);
}
} public class ConcreteStateA : State
{
public override string Name { get { return "StateA"; } } public override void Handle(Context context)
{
Console.WriteLine(Name + " is handling context."); // change context state
context.SetState(new ConcreteStateB());
}
} public class ConcreteStateB : State
{
public override string Name { get { return "StateB"; } } public override void Handle(Context context)
{
Console.WriteLine(Name + " is handling context."); // change context state
context.SetState(new ConcreteStateA());
}
} public class Client
{
public void TestCase1()
{
var context = new Context();
context.SetState(new ConcreteStateA()); context.Request();
context.Request();
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:State(状态)的更多相关文章
- 设计模式21:State 状态模式(行为型模式)
State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
- 设计模式学习笔记——State状态模式
从一个类中,将有关状态的处理分离出来,独立成类,并面向接口编程.作用是可以简化代码,避免过多的条件判断:if-else-
- State状态设计模式
1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...
- 程序设计模式 —— State 状态模式
我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...
- 设计模式---状态变化模式之state状态模式(State)
前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:Stat ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- C++设计模式-State状态模式
State状态模式作用:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. UML图如下: State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为. ...
- 设计模式(20)--State(状态模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式 ...
- 设计模式之美:Null Object(空对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...
随机推荐
- java基于socket公共聊天室的实现
项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...
- Java程序员必须熟知的十项技术
1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...
- SQL语句性能测试
/* --Sqlserver 清楚执行缓存, 用于SQL语句性能测试 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE */
- 接收新信息,在会话中看不到(thread表数据插入/更新失败)
分析原因:收到短信,sms表插入信息,触发器会自动更新thread表,更新失败导致一直有一条未读信息数量显示,但在会话列表中却看不到. (偶现,低概率. 解决方法:接收新信息插入后,立即查询threa ...
- VS 快捷键(待完善)
本人使用的是VS2010版本的 感觉还算稳定. 快捷键: 1. Ctrl+E,U 用于对选中的代码行快速对齐: 2. Ctrl+R,E 用于对象属性的重构,比如对get,set属性的快速设置. 方法: ...
- cannot determine the location of the vs common tools folder
问题:打开"VS2010开发人员命令提示后",上面提示"cannot determine the location of the vs common tools fold ...
- WinForm 文本框验证
这是一个自定义控件,继承了TextBox,在TextBox基础上添加了4个属性(下载): 1.ControlType 文本框需要验证的类型 2.ControlTypeText 显示的文字(只读) 3. ...
- GridView基础知识
首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...
- 在SqlServer查询分析器里 访问远程数据库 进行数据查询更新等操作(openrowset)
启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1 reconfigure exec sp_config ...
- js 变量提升和函数提升原理
关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代 ...