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

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

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

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

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);
        }
    }
客户端同上。

运用状态模式将特定状态相关的行为局部化,并且将不同状态的行为分割开来。把各种状态转移逻辑分布到子类之间来减少依赖。  这样的程序是有灵活性的。

通往“大神”的路上……

从状态模式看“大神”和“菜鸟”的区别,布布扣,bubuko.com

时间: 2024-11-18 07:13:44

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

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

<大话设计模式>中讲状态模式这一节名字叫做"无尽加班何时休-状态模式".菜鸟因为编程经验不足,解决这个问题的能力不够而不得不牺牲时间去不断的写代码结果还是重复出错. 而大神每次都能深入到问题的根源运用自己的思想去写代码.每一个问题都完美的解决. 加班的菜鸟一天各个时间段状态都不一样.从開始的精神百倍到越来越疲惫. 自己写出的代码不断带来问题. 代码是程序猿思维智慧的结晶,菜鸟"程序猿没有将自己的思维融入代码写出来的是这种: class Program { stat

【三层】大神与菜鸟的区别

     经过几天的奋战,终于对三层的概念有了大概的了解,不免有些小激动!因为过了三层即将来临的就是机房收费重构了.从软件工程开始,UML.C#.设计模式.VB.NET,再到现在的三层,都是在为机房收费的重构做准备..俗话说,光说不练假把式!有了一肚子墨水却写不出好文章,那就成了书呆子啦.. 步入正题,三层学完,看看我的收获吧!      一.设计分层的原则 1.逻辑分组. 例如,对用户界面,业务逻辑和数据访问组建应该使用不同的层.例如,A层可以访问B层,但B层不能访问A 层. 2.高内聚.低耦

ScrollView嵌套ListView的滑动冲突问题,是看大神的方法的,作为学习以后用的到

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 大神就是牛,给出了好

技术就是一层窗户纸-于无声处看大神

技术确实于无声处听惊雷.有的东西须要自己去经历.有的东西则须要自己思考后再高速从别人的经验中获取得到.以最快的方法到达目标.技术就是一层窗户纸,再捅破之前,须要自己切身去思考体会实现之难.最后别人从旁点拨一下,宛如醍醐灌顶.大彻大悟.怪不得他原来就是技术总监.自有他的道理. 1.get 跟 post 的差别. 一般无非就是:1.get通过url提交.能够提交的数据有限. post是通过http作为content提交,能够提交数据量大. 2.get是通过url提交,对用户可见. 不安全. post

用Properties类创建对象读取文档*txt格式书写ATM简单版本,看大神们有什么改进的,欢迎交流

先创建了一个ATM.txt格式的的文档,将卡的账号.密码.内存金额放在此文档 password=123money=5000userName=123 然后用类Properties创建一个对象,将银行卡的属性放进对象中,书写一个简单的ATM机实现简单的登录.存款.取款.查看.修改密码.退出程序等功能具体代码示例如下:package unit331; import java.io.FileReader; import java.io.FileWriter; import java.util.Prope

【leetcode】Wildcard Matching(hard) ★ 大神太牛了

Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). The function p

iOS开发-状态模式

状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行为,不同的是可以将行为委托到当前状态.一个需要从外部设置,一个是内部通过状态变更达到行为变成的目的. 基础知识 状态模式的UML类图: State封装基本的状态行为,我们通过Cotext上下文持有状态子类的实例,外部发起请求,我们就可以委托状态进行处理.地铁里面一般都有自动饮料售卖机,我们将所有的饮

&quot;菜鸟&quot;与大神程序员之间的差别(转载)

前段时间看到一篇文章,写得很好,针对菜鸟与大神之间的差别做了很客观.很透彻的分析,现在将文章转载过来,原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=239356&highlight=%E8%8F%9C%E9%B8%9F “菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术 的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是我们程序员的家,那您是否可想过程序员为什么会有

学会思考--菜鸟程序员晋升大神之路

"菜鸟"和"大神" 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,那您是否可想过程序 员为什么会有不同的水平?你又是哪一类的程序员?"菜鸟"程序员和"大神"程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为"菜鸟"