首页 > 代码库 > 从状态模式看“大神”和“菜鸟”的差别

从状态模式看“大神”和“菜鸟”的差别

      《大话设计模式》中讲状态模式这一节名字叫做“无尽加班何时休-状态模式”。菜鸟因为编程经验不足。解决这个问题的能力不够而不得不牺牲时间去不断的写代码结果还是重复出错。

而大神每次都能深入到问题的根源运用自己的思想去写代码,每一个问题都完美的解决。

     加班的菜鸟一天各个时间段状态都不一样,从開始的精神百倍到越来越疲惫。自己写出的代码不断带来问题。

     代码是程序猿思维智慧的结晶,菜鸟”程序猿没有将自己的思维融入代码写出来的是这种:

class Program
    {

        static void Main(string[] args)
        {
            Work emergencyProjects = new Work();
            emergencyProjects.Hour = 9;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 10;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 12;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 13;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 14;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 17;

            emergencyProjects.TaskFinished = false;

            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 19;
            emergencyProjects.WriteProgram();
            emergencyProjects.Hour = 22;
            emergencyProjects.WriteProgram();

            Console.Read();
        }

    }
    class Work
    {
        private int hour;
        public int Hour
        {
            get { return hour; }
            set { hour = value; }
        }
        private bool finish = false;
        public bool TaskFinished
        {
            get { return finish; }
            set { finish = value; }
        }

        public void WriteProgram()
        {
            if (Hour < 12)
            {
                Console.WriteLine("当前时间:{0}点 上午工作,精神百倍", Hour);

            }
            else if (Hour < 13)
            {
                Console.WriteLine("当前时间{0}点 饿了,午饭;犯困,午休。", Hour);
            }
            else if (Hour < 17)
            {
                Console.WriteLine("当前时间:{0}点 下午状态不错。继续努力", Hour);
            }
            else
            {
                if (finish)
                {
                    Console.WriteLine("当前时间{0}点 下班回家了", Hour);
                }
                else
                {
                    if (Hour < 12)
                    {
                        Console.WriteLine("当前时间{0}点 加班哦,疲累", Hour);
                    }
                    else
                    {
                        Console.WriteLine("当前时间{0}点 不行了。睡着了。", Hour);
                    }
                }
            }
        }

    }


        这种代码方法过长,里面推断分支太多假设要添加一些情况会修改非常多的代码。给维护带来非常大的风险。

     运用状态模式:

 //工作类,如今没有了过长的分支推断语句
    public class Work
    {
        private State current;
        public Work ()
        {
            current = new ForenoonState();//初始化工作状态为上午。即9点
        }        
        
        //"钟点"属性。状态转换根据
        private double  hour;
        public double Hour
        {
            get { return hour; }
            set { hour = value; }            
        }
        //“任务完毕”属性,是否下班的根据
        private bool finish = false;
        public bool TaskFinished
        {
            get { return finish; }
            set { finish = value; }
        }
        public void SetState(State s)
        {
            current = s;
        }
        public void WriteProgram()
        {
            current.WriteProgram(this);
        }
    }

    //抽象状态
    public abstract class State
    {
        public abstract void WriteProgram (Work w);
    }

    //上午工作状态
    public class ForenoonState : State
    {
        public override void WriteProgram(Work w)
        {
            if (w.Hour < 12)
            { Console.WriteLine("当前时间:{0}点 上午工作。精神百倍", w.Hour); }
            else
            {
                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 SleepingState : State
    {
        public override void WriteProgram(Work w)
        {
            Console .WriteLine ("当前时间:{0}点 不行了,睡着",w.Hour );
        }
    }
    //下班歇息状态
    public class RestState : State
    {
        public override void WriteProgram(Work w)
        {
            Console.WriteLine("当前时间:{0}点 下班回家了", w.Hour);
        }
    }
client同上。
        运用状态模式将特定状态相关的行为局部化,而且将不同状态的行为切割开来。

把各种状态转移逻辑分布到子类之间来降低依赖。

 这种程序是有灵活性的。

      通往“大神”的路上……








从状态模式看“大神”和“菜鸟”的差别