关闭

C#设计模式系列:状态模式(State)

447人阅读 评论(0) 收藏 举报
分类:

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无需关心状态的切换逻辑,每个状态对象也只需关心状态的下一个可能状态的切换逻辑。

 

  状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式的目的是为了将状态与不同状态下的行为进行分离,从而简化复杂的条件判断。

  状态模式主要适用场景:

  ◊ 一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变其行为;

  ◊ 一个操作中包含庞大的分支结构,并且这些分支决定于对象的状态。

0
0
查看评论

设计模式之状态STATE模式(C++)

状态模式:属于行为型模式的其中一种,其允许一个对象在内部改变状态时改变它的行为,对象看起来似乎修改了它的类。 状态模式主要解决的是当控制一个对象的状态转换条件表达式过于复杂时的情况,把状态的逻辑判断转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。好处就是讲于特定状态相关的行为局部化,并且...
  • hailong0715
  • hailong0715
  • 2016-07-22 14:46
  • 616

设计模式之十 --- 状态(State)模式

【1】基本概念          状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。【2】简单分析         我们先来看下该设计模式的UML的结构图...
  • cjjky
  • cjjky
  • 2012-05-20 19:04
  • 15619

【设计模式】学习笔记14:状态模式(State)

认识状态模式 假设有一个糖果机, 它的工作状态图如下:要用代码实现糖果机的功能, 如果不用状态模式: 一种方法是创建一个类,它的作用就是一个状态机,对每一个动作,我们都创建了一个对应的方法,这些方法用条件语句来决定在每一个状态内什么方法是最恰当的.比如对"投入25分钱"这个动作...
  • shuangde800
  • shuangde800
  • 2013-08-22 00:15
  • 20278

PHP设计模式系列(十一):状态模式

状态模式状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。模式结构状态模式包含如下角色: Context: 环境类 State: 抽象状态类 Con...
  • qq_32300363
  • qq_32300363
  • 2017-04-30 16:28
  • 377

23种设计模式 之 State模式(状态模式)[C语言]

一、概念定义     State模式:允许一个对象在其状态发生改变时,改变它的行为。     State模式和Strategy模式非常相似,需要说明的是两者的思想是一致的;只不过封装的对象不同:State模式封装的是不同的状态,而Strat...
  • RoyalApex
  • RoyalApex
  • 2012-11-14 16:07
  • 3035

"围观"设计模式(21)--行为型之状态模式(State Pattern)

状态模式--允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。----百度百科 个人理解 状态模式应该说可以理解为某种状态下,程序的执行流程可能会发生变化,类似于交通灯,红灯的时候停下,绿灯行走,黄灯时等一等,这就是三种状态下我们人对其作出的相应的变化。再比...
  • wangyang1354
  • wangyang1354
  • 2016-06-13 15:11
  • 3456

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解本文地址: http://blog.csdn.net/caroline_wendy状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类.建立Context类, 包含多个具体状态(concre...
  • u012515223
  • u012515223
  • 2014-07-11 17:42
  • 2149

设计模式学习笔记——状态(State)模式框架

设计模式学习笔记——状态(State)模式框架@(设计模式)[设计模式, 状态模式, State]设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 DayState类 NightState类 Context接口 SafeFrame类 测试类 运行结果 界面 ...
  • q547550831
  • q547550831
  • 2017-04-13 10:47
  • 404

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城市可以纵向延伸,向空中伸展。汽车对城市的发展我们就不说了,电梯,你想想看,如果没有电梯,每天你需要爬...
  • u012401711
  • u012401711
  • 2016-09-26 23:45
  • 3117

PHP设计模式——状态模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。         状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态...
  • jhq0113
  • jhq0113
  • 2015-06-10 10:53
  • 3444
    个人资料
    • 访问:8063次
    • 积分:319
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:34篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论