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),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...
随机推荐
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- 未能添加对***.dll的引用 问题解决方法
这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...
- tessnet2.Tesseract Init程序退出问题解决
1.检查语言包与引用库版本是否一致.2.0需要使用2.0的语言包.(http://www.pixel-technology.com/freeware/tessnet2/) 2.是否安装过3.0,安装中 ...
- github for windows 安装 使用
遇到无数的未知问题.光是安装就搞了好久. 安装程序显示安装了.NET Framework4.5,然后提示重启.重启后,自动开始下载文件,最多到2%就走不动了. 后来请求了下面这个链接,才开始下载了(虽 ...
- STM32之输入捕获以及小小应用(库)
五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
- 设计模式(十二):bridge模式
刚开始看到这个模式并不是很理解,之后在网上看到别人的博客,才大致抓住了脉络. 何谓抽象和实现分离:就是将一个实际的物件跟它的所具有的功能分离.<大话设计模式>中有对手机品牌和具体的手机应用 ...
- android之Handler机制
简单例子开头: 网络http请求网站源码数据并显示 注意点:访问网络需要加Internet权限: android.permission.INTERNET 简单的步骤: 使用UrlConnection请 ...
- 关于pl/sql数据库下拉中选项为空的问题
1.可能是在配置环境变量TNS_ADMIN的时候后面多了一个分号,去掉分号就可以了
- 下载判断Android和iOS
//下载 function down(){ var url = ''; var u = navigator.userAgent, app = navigator.appVersion; var isA ...
- jenkins配置源码管理git
一.首先安装上来jenkins 二.下载安装jenkins的git插件:Git plugin 三.新建一个jenkins项目,选择构建一个自由风格的软件项目: 源码管理选择git,Repository ...