zoukankan      html  css  js  c++  java
  • State

    状态模式(State)主要是解决当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。(如果状态判断很简单,就没必要使用状态模式了。)

    将特定的状态相关的行为都放入到一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所有通过定义新的子类可以很容易地增加新的状态和转换。(说白了就是消除庞大的条件分支语句。)

    状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

    当一个对象的行为取决于它的状态,并且它必须在运行时刻改变它的行为时,就可以考虑使用状态模式了。

        //抽象状态
       public abstract class State
        {
           public abstract void WriteProgram(Work w);
        }
    
        //上午和中午工作状态类
        class ForenoonState : State
        {
            public override void WriteProgram(Work w)
            {
                if (w.hour < 12)//这个地方的判断,才是状态模式的要点。
                {
                    Console.WriteLine("当前时间:{0}点,上午工作,精神百倍。", w.hour);
                }
                else
                {//超过12点,则转入中午工作状态。这个地方,用一种非常高明的手段,让合适的方法来处理当前所处的状态。其实,如果世界项目中需要,也可以直接抛出异常。
                    w.SetState(new NoonState());
                    w.WriteProgram();
                }
            }
        }
    
        //中午工作状态
        public class NoonState : State
        {
            public override void WriteProgram(Work w)
            {
                if (w.hour < 13)
                {
                    Console.WriteLine("当前时间:{0}点 饿了,午饭;犯困,午休。", w.hour);
                }
                else
                {
                    w.SetState(new AfternoonState());
                    w.WriteProgram();
                }
            }
        }
    
        //下午的工作状态
        public class AfternoonState:State
        {
            public override void WriteProgram(Work w)
            {
                if (w.hour > 17)
                {
                    Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力", w.hour);
                }
                else {
                    w.SetState(new EveningState());
                    w.WriteProgram();
                }
            }
        }
    
        //晚间工作状态
        public class EveningState : State
        {
            public override void WriteProgram(Work w)
            {
                if (w.TaskFinished)
                {
                    w.SetState(new RestState());
                    w.WriteProgram();
                }
                else
                {
                    if (w.hour < 21)
                    {
                        Console.WriteLine("当前时间:{0}点 加班哦,疲累之极", w.hour);
                    }
                    else
                    {
                        w.SetState(new SleepingState());
                        w.WriteProgram();
                    }
                }
            }
        }
    
        //下班休息状态
        public class RestState : State
        {
            public override void WriteProgram(Work w)
            {
                Console.WriteLine("当前时间:{0}点下班回家了",w.hour);
            }
        }
    
        //睡眠状态和下班休息状态
        public class SleepingState : State
        {
            public override void WriteProgram(Work w)
            {
                Console.WriteLine("当前时间:{0}点不行了,睡着了。", w.hour);
            }
        }
    
        //工作类,此时没有了过长的分支判断语句。
        public class Work
        {
            private State current;
            public Work()
            {
                current = new ForenoonState();//工作初始化为上午工作状态,即上午9点开始上班。
            }
            public double hour { get; set; }
            public bool TaskFinished { get; set; }//任务完成属性,是否下班的依据。
            public void SetState(State s)
            {
                current = s;
            }
            public void WriteProgram()
            {
                current.WriteProgram(this);
            }
        }
    
            static void Main(string[] args)
            {
                Work myWork = new Work();
                myWork.hour = 9;
                myWork.WriteProgram();
                myWork.hour = 10;
                myWork.WriteProgram();
                myWork.hour = 11;
                myWork.WriteProgram();
                myWork.hour = 12;
                myWork.WriteProgram();
                myWork.hour = 14;
                myWork.WriteProgram();
                myWork.hour = 17;
                myWork.WriteProgram();
                Console.Read();
            }
  • 相关阅读:
    linux基础学习6
    Linux基础学习5
    Linux基础学习4
    Linux基础学习3
    Linux基础学习2
    ASP.NET MVC学习——控制器传递数据到view的简单案例
    转载:URL链接中的不同用处
    MVC学习的心路历程
    45道SQL数据题详细超基础解析
    结束基础,开始MVC之旅!
  • 原文地址:https://www.cnblogs.com/vichin/p/11764510.html
Copyright © 2011-2022 走看看