【C#设计模式-状态模式】

一.状态模式的定义:状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

二.状态模式的意图:允许一个对象在其内部状态改变时改变它的行为。

三.状态模式的适用场景:

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

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

四.状态模式的实现:

    /// <summary>
    /// 定义接口,封装Context对象在特定状态下的行为
    /// </summary>
    public abstract class AbstractState
    {
        public abstract void handle(Context context);
    }
    /// <summary>
    /// 具体A状态下的对于的行为
    /// </summary>
    public class ConcreteStateA:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}",this.GetType().ToString());
            //改变状态
            context.State = new ContextStateB();
        }
    }
    /// <summary>
    /// 具体B状态下的对于的行为
    /// </summary>
    public class ContextStateB:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}",this.GetType().ToString());
            //改变状态为C
            context.State = new ContextStateC();
        }
    }
    /// <summary>
    /// 具体C状态下的对于的行为
    /// </summary>
    public class ContextStateC:AbstractState
    {
        public override void handle(Context context)
        {
            Console.WriteLine("当前状态:{0}", this.GetType().ToString());
            //改变状态为A
            context.State = new ConcreteStateA();
        }
    }
    public class Context
    {
        //Context 类需要维护一个ConcreteState 的实例,这个具体状态类的实例给出了此环境下的对象的现有状态。
        public AbstractState State { get; set; }

        public Context(AbstractState state)
        {
            this.State = state;
        }
        public void Request()
        {
            State.handle(this);
        }
    }
    /// <summary>
    /// C#设计模式-状态模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Context c = new Context(new ConcreteStateA());
            c.Request();//在 ConcreteStateA 中,我将 Context 的状态切换回 ContextStateB ,
            c.Request();//而 ContextStateB 中,我将 Context 的状态切换回 ContextStateC,
            c.Request();//而 ContextStateC 中,我将 Context 的状态切换回 ConcreteStateA,
            c.Request();//这样便实现了 Context 在 A , B ,C 这三种状态中循环的切换。
        }
    }

五.总结:

在一些情况下,一个对象的行为取决于一个或者是多个动态变化的属性,这些的属性就叫做状态,拥有这些属性的对象称为状态对象,这些对象的状态是从事先定义好的一系列值中取出的,当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统行为也随之改变。状态模式把所研究的对象的行为包装在不同的状态对象里,

每一个状态对象都属于一个抽象状态类的子类,状态模式的意图是让一个对象在其内部状态发生改变时其行为也随之改变。

时间: 2024-08-28 19:31:17

【C#设计模式-状态模式】的相关文章

设计模式 状态模式 以自动售货机为例

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的. 下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下: 分析一个这个状态图: a.包含4个状态(

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

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

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

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

14. 星际争霸之php设计模式--状态模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248198.html============================================

设计模式-状态模式(State Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态,在当前状态发生变化是,这个对象执行和之前相同的操作也会有不同的作用效果. 状态模式的定义和基本结构 定义:状态模式允许一个对象在其内部状态改变的时候改变它的行为,就像变成了另一个对象一样. 一张来自<Head First>的结构图 Context:这个类里面包含了很多种状态类,当前状态不同时,这个

大话设计模式—状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象. 大话设计模式中程杰老师给出的定义是,状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.当然,如果这个状态判断很简单就没有必要使

设计模式—状态模式

转载自CSDN:http://blog.csdn.net/hguisu/article/details/7557252,以便查阅,非原创 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改

深入浅出设计模式——状态模式(State Pattern)

模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化.在UML中可以使用状态图来描述对象状态的变化. 模式定义状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for Stat

PHP设计模式——状态模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. UML类图: 角色: 上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理. 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状