C#设计模式系列:状态模式(State)
1、状态模式简介
1.1>、定义
状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为。
状态模式的针对性很强,当有状态变化的时候可以选择状态模式。
1.2>、使用频率
中等
2、状态模式结构
2.1>、结构图

2.2>、参与者
状态模式参与者:
◊ Context:状态管理器
° 定义对Client感兴趣的接口
° 维持一个ConcreteState子类的实例,这个实例定义当前状态
◊ State:状态,定义一个接口以封装与Context的一个特定状态相关的行为。
◊ ConcreteState:具体状态子类,每一子类实现的一个与Context的一个状态相关的行为。
3、状态模式结构实现

State.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public abstract class State
{
public abstract void Handle(Context context);
}
}
Context.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class Context
{
private State _state; public Context(State state)
{
this.State = state;
} public State State
{
get
{
return _state;
}
set
{
_state = value;
Console.WriteLine("State: " + _state.GetType().Name);
}
} public void Request()
{
_state.Handle(this);
}
}
}
ConcreteStateA.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
}
ConcreteStateB.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Structural
{
public class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.StatePattern.Structural; namespace DesignPatterns.StatePattern
{
class Program
{
static void Main(string[] args)
{
// Setup context in a state
Context c = new Context(new ConcreteStateA()); // Issue requests, which toggles state
c.Request();
c.Request();
c.Request();
c.Request();
}
}
}
运行输出:
State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
State: ConcreteStateB
State: ConcreteStateA
请按任意键继续. . .
4、状态模式的实践应用
假设有一个Task,其状态有4种:Pending、Running、Cancelled和Finished。
根据业务需求描述,建立状态图。

状态模式实现:

State.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public abstract class State
{
public abstract void Start(Task task); public abstract void Cancel(Task task);
}
}
PendingState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class PendingState : State
{
public override void Start(Task task)
{
task.State = new RunningState();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
RunningState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class RunningState:State
{
public override void Start(Task task)
{
// RunningState执行Start方法转为FinishedState
task.State = new FinishedState();
} public override void Cancel(Task task)
{
// RunningState执行Cancel方法转为CancelledState
task.State = new CancelledState();
}
}
}
CancelledState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class CancelledState : State
{
public override void Start(Task task)
{
throw new NotImplementedException();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
FinishedState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.StatePattern.Practical
{
public class FinishedState : State
{
public override void Start(Task task)
{
throw new NotImplementedException();
} public override void Cancel(Task task)
{
throw new NotImplementedException();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.StatePattern.Practical; namespace DesignPatterns.StatePattern
{
class Program
{
static void Main(string[] args)
{
Task task = new Task();
task.State = new PendingState();
//Task task = new Task(new PendingState());
task.Start();
//task.Start();
task.Cancel();
}
}
}
运行结果:
State : Pending
State : Running
State : Cancelled
请按任意键继续. . .
5、状态模式应用分析
状态模式效果:
1>、状态模式的本质是将条件语句的各个分支封装起来,从而实现了状态逻辑与动作的分离。当分支很多时,状态模式可以给代码的维护带来很大的便利。
2>、多态性的实现。
3>、状态转换的显示化。状态模式将状态的切换逻辑存放到状态对象中,可以实现状态的自动切换,使各个状态界限分明,相互独立。
4>、采用分支结构时,Context对象需要关心所有状态的切换逻辑,当分支越来越多时,复杂度也会越来越大。而状态模式中Context无需关心状态的切换逻辑,每个状态对象也只需关心状态的下一个可能状态的切换逻辑。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式的目的是为了将状态与不同状态下的行为进行分离,从而简化复杂的条件判断。
状态模式主要适用场景:
◊ 一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变其行为;
◊ 一个操作中包含庞大的分支结构,并且这些分支决定于对象的状态。
C#设计模式系列:状态模式(State)的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式之 -- 状态模式(State)
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------状态模式State
一,总体概要 1,笔者浅谈 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...
随机推荐
- Java数据结构——栈的应用(以数制转换为例子)
看一万遍,不如自己动手实践,请不要直接copy代码,先自己去理解例子实现的原理,然后试着自己动手去实践. 用Java去实现栈操作,会用到stack这个类,这类中有几个方法需要知道他们的用法 bool ...
- 弱省互测#2 t2
题意 给两个树,大小分别为n和m,现在两棵树各选一些点(包括1),使得这棵树以1号点为根同构(同构就是每个点的孩子数目相同),求最大的同构树.(n, m<=500) 分析 我们从两棵树中各取出一 ...
- 使用display:table来解决一些问题
一直有,多栏的需求,当然用table布局,很快就做完了.不怎么喜欢用table,刚开始使用display:table,但是有一条老是不能达到我的效果,那就是有一行不固定宽度的时候,就不知道怎么处理,今 ...
- 一站式解决,Android 拍照 图库的各种问题.
在android开发中, 在一些编辑个人信息的时候,经常会有头像这么一个东西,就两个方面,调用系统相机拍照,调用系统图库获取图片.但是往往会遇到各种问题: 1.oom 2.图片方向不对 3.activ ...
- java分享第十四天(TestNG Assert详解)
TestNG Assert 详解org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参 ...
- pythonchallenge 解谜 Level 5
第五关的确很坑爹... 不过,根据之前的思路,我想着是把信息放在了 “源码” 中. 翻了下源码.有用的东西在以下部分. <html><head> <title>pe ...
- Java中堆内存和栈内存详解
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- 不能链接云服务器mysql
如果报host'' 不允许连接MySQL服务器 1130 错误的话如果你的3306端口打开了,也把user 里的host改为% 还是不行的话,请记得更改 站点域名设置,和你服务器相同,端口一致.
- VB.net 2010下关联与程序图标设置
'*************************************************************************'**模 块 名:VB.net 2010下关联与程序 ...
- canvas初探2
2.2 canvas的绘图环境 canvas仅仅只是一个绘图的容器,其内存在一个绘图环境,该环境对象提供了全部的绘图功能. 目前canvas的绘图环境是2d,但canvas规范在着手准备支持其他类型的 ...