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. 编译原理词法分析 java简单实现

    package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundEx ...

  2. c#比较两个List相等

    1.if(ListA.Count == ListB.Count && ListA.Count(t => !ListB.Contains(c)) == 0) 数量相等,元素值相等即 ...

  3. [VijosP1639]机密文件 题解

    题目大意: m个人抄n份资料,资料有编号,每人抄连续的几份资料,每份资料页数不一定相等,每个人抄的速度相同,求使得总时间最少的方案(总时间相同,越前面的人抄的越少) 思路: 假设每人一天抄一页,二分天 ...

  4. 【翻译svg教程 】svg 的坐标系统

    http://tutorials.jenkov.com/svg/svg-coordinate-system.html svg的坐标系统(和大多数计算机绘图的坐标系统)和数学中绘图系统有点不一样 数学/ ...

  5. HTML解析器HtmlAgilityPack的一些使用总结(C#)

    哎~本来这些总结是作为使用时的快速备注,但是用不上了.实际应用当中HtmlAgilityPack的可靠性不太稳定,一主要问题是:-> 一些字符会出现乱码或者变成'?',如韩语字符.由于我是已经有 ...

  6. oracle 字符串分割

    ); create or replace function strsplit2(p_value varchar2, p_split varchar2 := ',') return str_split ...

  7. C\C++ 1A2B小游戏源码

    学了一段时间,心血来潮写了一个1A2B小游戏,很多人应该玩过,是一个挺有意思的益智小游戏,之前用易语言写过,现在又用C++重写了一下. 编译运行无错,整体程序设计思路为:进入循环,初始化游戏,读入一个 ...

  8. 原生Ajax 和Jq Ajax

    前言:这次介绍的是利用ajax与后台进行数据交换的小例子,所以demo必须通过服务器来打开.服务器环境非常好搭建,从网上下载wamp或xampp,一步步安装就ok,然后再把写好的页面放在服务器中指定的 ...

  9. android——自定义listView

    都知道微信主机面 有个界面会一行一一行的聊天记录,那个效果就可以用listview来实现(当然这只是其中的一种) listView是一种比较常见的组件它用来展示列的view,它是根据数据的长度来显示数 ...

  10. SQL Server 求结果

    ;with cte as ( select  CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select datead ...