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

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

      《大话设计模式》中讲状态模式这一节名字叫做“无尽加班何时休-状态模式”。菜鸟由于编程经验不足,解决问题的能力不够而不得不牺牲时间去不断的写代码结果还是反复出错。而大神每次都能深入到问题的根源运用自己的思想去写代码,每个问题都完美的解决。

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

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

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);
        }
    }
客户端同上。
        运用状态模式将特定状态相关的行为局部化,并且将不同状态的行为分割开来。把各种状态转移逻辑分布到子类之间来减少依赖。  这样的程序是有灵活性的。

      通往“大神”的路上……