状态(state)模式

*状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的时候,吧状态判断逻辑独立到一系列的类中,

是复杂的逻辑简单化。

           Work work = new Work();
            work.Hour = 10;
            work.WriteProgram();

            work.Hour = 13;
            work.WriteProgram();
            work.Hour = 16;
            work.WriteProgram();

            work.Hour = 25;
            work.WriteProgram();

    /// <summary>
    /// 抽象状态
    /// </summary>
    public abstract class StateJob
    {
        public abstract void WriteProgram(Work work);
    }

    //具体状态
    public class ForenoonState : StateJob
    {
        public override void WriteProgram(Work work)
        {
            if (work.Hour < 12)
                Console.WriteLine("当前时间:‘{0}‘,上午工作时间", work.Hour);
            else
            {
                work.SetState(new RestState()); work.WriteProgram();
            }
        }
    }

    //具体状态
    public class RestState : StateJob
    {
        public override void WriteProgram(Work work)
        {
            if (work.Hour < 14)
                Console.WriteLine("当前时间:‘{0}‘,午休时间", work.Hour);
            else
            { work.SetState(new AfternoonState()); work.WriteProgram(); }
        }
    }

    //具体状态
    public class AfternoonState : StateJob
    {
        public override void WriteProgram(Work work)
        {
            if (work.Hour < 18)
                Console.WriteLine("当前时间:‘{0}‘,下午工作时间", work.Hour);
            else
            { work.SetState(new SleepState()); work.WriteProgram(); }
        }
    }
    //具体状态
    public class SleepState : StateJob
    {
        public override void WriteProgram(Work work)
        {
            Console.WriteLine("当前时间:‘{0}‘,睡觉时间",work.Hour);
        }
    }

    //工作类
    public class Work
    {
        public int Hour
        { get; set; }

        public bool finish
        { get; set; }

        private StateJob current;          //初始状态
        public Work()
        {
            current = new ForenoonState();
        }
        public void SetState(StateJob s)
        {
            current = s;
        }
        public void WriteProgram()
        {
            current.WriteProgram(this);
        }
    } 
  Context c = new Context(new ConStateB());

            c.Request();
            c.Request();
            c.Request(); 

    /// <summary>
    /// 抽象状态
    /// </summary>
    public abstract class State
    {
        public abstract void Handel(Context context);
    }

    /// <summary>
    /// 具体状态 ConcreteSate
    /// </summary>
    public class ConStateA : State
    {
        public override void Handel(Context context)
        {
            context.State = new ConStateB();
        }
    }

    /// <summary>
    /// 具体状态
    /// </summary>
    public class ConStateB : State
    {
        public override void Handel(Context context)
        {
            context.State = new ConStateA();
        }
    }

    /// <summary>
    /// 维护一个ConcreteSate子类
    /// </summary>
    public class Context
    {
        private State state;

        public Context(State _state)
        {
            this.state = _state;
        } 

        public State State
        { get; set; }

        public void Request()
        {
            Console.WriteLine("当前状态:‘{0}‘", state.GetType().Name);
            state.Handel(this);
        }
    }

状态(state)模式

时间: 2024-10-09 20:18:20

状态(state)模式的相关文章

Java 实现状态(State)模式

/** * @author stone */ public class WindowState { private String stateValue; public WindowState(String stateValue) { this.stateValue = stateValue; } public String getStateValue() { return stateValue; } public void setStateValue(String stateValue) { t

Android与设计模式——状态(State)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 状态模式的结构 用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类.状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变.状态模式的

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

Java状态模式(State模式)

State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊

State模式(状态设计模式)

State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于状态的处理,来执行具体的操作 理清职责 实现功能: ·有一个金库 ·金库与警报中心相连 ·金库里有警铃和正常通话用的电话·金库里有时钟,监视着现在的时间 ·白天的时间范围是9:00~16:59,晚上的时间范围是17:00~23:59和0:00~8:59 ·金库只能在白天使用 ·白天使用金库的话,会在

c++ 行为型模式_状态(State)

1) 意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 2) 结构 其中: Context定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义当前状态 State定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState每个子类实现与Context的一个状态相关的行为 3) 适用性 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象

有限状态自动机FSM实现(二)--State模式

基于switch结构的有限状态自动机的实现已经在前一篇博文中给出,请猛击. State模式适用于如下情况: 1)一个对象的行为取决于它的状态,并且必须在运行时根据状态改变它的行为. 2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态. State模式包含如下对象: Context对象 1)定义客户感兴趣的接口. 2)维护一个State子类的实例,这个实例定义当前状态. State状态对象 定义一个接口封装与Context的一个特定状态相关的行为. 以下图为例:TCPConne

【行为型】State模式

状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路状态下,你所对应的是走路动作:在跑步时,你的双手双脚动作明显频率.步伐都加快,即:在跑步状态下,你所对应的是跑步动作:........:在睡着时,你的全身都是不动的,即:睡着状态下,你是处于睡觉的动作状态.在实际项目开发中,(该模式)最常见的框架设计便是FSM了.模式的类关系结构图参考如下: 编码结

State 模式

State模式中我们将状态逻辑和动作实现进行分离.允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类:在一个状态即将结束的时候启用下一个状态. 1 /////////state.h///////////////////////////////////////////////////////////////// 2 #pragma once 3 class Context ; 4 class State 5 { 6 public: 7 virtual ~State(); 8 S