稻草堆上打着滚儿

稻草堆上打着滚儿

讲故事

彩虹环绕这秋香、春香、夏香,秋香、春香、夏香环绕着我,这时键盘飞入我的怀中(小朋友,你是否有许多的问号),飞速的敲击键盘,不一会儿婀娜多姿的冬香也出现在我的面前。

有了四大美人相伴,那我的生活要好好重新安排一下,早上谁来服侍我,中午谁来服侍我,下午谁来服侍我,晚上谁来服侍我,想想都美啊~

安排...

Coding

客户端 开始我一天的生活

    internal class Program
    {
        private static void Main(string[] args)
        {
            var life = new Life();
            //设置天气
            life.Weather = Weather.Good;

            life.Time = Time.Morning;
            life.Doing();

            life.Time = Time.Noon;
            life.Doing();

            life.Time = Time.Afternoon;
            life.Doing();

            life.Time = Time.Night;
            life.Doing();

            Console.WriteLine("\nHappy Ending~");
            Console.ReadLine();
        }
    }

结果展示:

现在是 早上,春香 服侍我起床~

现在是 中午,夏香 陪我玩耍~
天气真好,陪我出去放风筝

现在是 下午,秋香 服侍我用餐~

现在是 晚上,冬香 服侍我就寝~

结果还是挺美好的,但是 这个实现过程很是糟糕。

尤其是Life.Doing()

        /// <summary>
        /// 干啥子
        /// </summary>
        public void Doing()
        {
            if (Time == Time.Morning)
            {
                Console.WriteLine($"\n现在是 早上,春香 服侍我起床~");
            }
            else if (Time == Time.Noon)
            {
                Console.WriteLine($"\n现在是 中午,夏香 陪我玩耍~");
                if (Weather == Weather.Good)
                {
                    Console.WriteLine($"天气真好,陪我出去放风筝");
                }
                else
                {
                    Console.WriteLine($"天气不好,待家给我跳舞");
                }
            }
            else if (Time == Time.Afternoon)
            {
                Console.WriteLine($"\n现在是 下午,秋香 服侍我用餐~");
            }
            else if (Time == Time.Night)
            {
                Console.WriteLine($"\n现在是 晚上,冬香 服侍我就寝~");
            }
            else
            {
                Console.WriteLine($"\n睡觉中...");
            }
        }

这个方法存在以下问题:

  1. 方法很长(如果我们再把时间段细分以下,或者每个时间段做的事情增加。实际开发中,可能每个判断中包含很多很复杂的业务逻辑)。开发过程中,我们要尽量保持每个方法体代码行数不超过50行。
  2. 判断分支太多。if else很多,并且还存在嵌套,该方法的责任过大,同时也不方便阅读。
  3. 维护困难。以后要增加时间段,比如我 想在深夜 有人来服侍我吃宵夜,要修改Life.Doing()来实现,这完全违背了我的人生信条的第3条!

如何解决上面的问题呢?这时房中升起了四个金光闪闪的大字——状态模式

状态模式

敲黑板·划重点

解决方法已经找到,就开始干吧...

Code Upgrade

客户端代码 和 输出结果 同上

现在,我们再来看看Life.Doing()

    /// <summary>
    /// 干啥子
    /// </summary>
    public void Doing()
    {
        _timeHandle.Doing(this);
    }

方法简洁明了,消除了过多的判断分支。

同时Life类的职责简化了,做到代码的责任分解。符合了我人生信条的第1条和第3条。

这时候,我们再要增加一个深夜吃夜宵的时间段,Life类就不需要动了。我们只需增加WeeHoursTime类实现ITimeHandle,调整NightTime中的判断就可以了。

吟诗

糟糕的问题完美解决,我心甚欢,吟诗一首:

桃花坞里桃花庵,

桃花庵下桃花仙。

桃花仙人敲代码,

桃花运来年复年。

示例代码地址: https://gitee.com/sayook/DesignMode/tree/master/State

04-27 03:02