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)的更多相关文章

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

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

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

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

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

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

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

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

  5. 设计模式2——状态模式State

    参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...

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

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

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

     状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...

  8. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

  9. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. 大熊君说说JS与设计模式之------状态模式State

    一,总体概要 1,笔者浅谈 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...

随机推荐

  1. JSTL标签库

    JSP页面作为内嵌java的Html简化了Servlet在控制页面显示的语法,但JSP脚本中的表达式功能不够强大,语法也稍显繁杂,EL(Expression Language)表达式语言的出现能够大大 ...

  2. 常用str函数

    echo stripslashes("Who\'s Bill Gates?"),'<br />';//去掉反斜杠 echo strtolower("AABbb ...

  3. MVC Razor视图引擎的入门

    首先我们来说说他的给我们开发者带来那些好处吧: Razor语法易于输入,易于阅读,微软当时是这样定义的:简洁,富有表现力和灵活性,支持所有文本编辑器,强大的智能提示功能,单元测试. Rozor文件类型 ...

  4. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

  5. swift初体验

    swift是一门类型安全的语言,同样也是基于c语言 那么c语言的一些类型也是实用的,不同的是:swift声明变量和常量是不一样的 let:用来修饰常量:var用来修饰变量 e.g: let num=1 ...

  6. python 虚拟环境

    python3 目录venv创建为虚拟环境,并激活. $ python3 -m venv ./venv$ source venv/bin/activate -m: -m mod : run libra ...

  7. iOS8沙盒路径的变化

    iOS8中的的沙盒路径发生了变化 之前是这样的路径,通过NSHomedictionary()获取的家路径 /Users/wupeng/Library/Application Support/iPhon ...

  8. 【luogu】 P1880 石子合并

    原题原题原题原题原题 先贴上错误代码... ↓错误代码↓ #include <iostream> #include <cstdio> #include <cstring& ...

  9. CentOS6.5安装Eclipse

    安装说明 1.安装环境: CentOS6.5 64位系统 2.安装方式:tar.gz安装 3.软 件 包:eclipse-jee-luna-SR1-linux-gtk-x86_64.tar.gz 4. ...

  10. syntax error near unexpected token‘(

    用虚拟机的时候出现这样的: 上网查了资料之后,在括号"( " 前加上"$"字符就暂时不会提示出错了.