C#设计模式之状态模式

前言

很好理解。这个名字让人听起来都很安静。看看在设计模式里,状态模式是怎样的吧

状态模式

英文:State

what

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像时改变了其类。
主要解决的是当一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。
如果这个状态很简单,就没必要用“状态模式”了。

情景

夏天到了,我们总是由早晨的激情澎湃转换成中午的困意满满。这便是状态发生了改变。若写成代码,也许大家都会想到if 。。else和switch语句,但是一天状态转变的太多了,switch语句也会很多,这就造成了方法过长的坏味道。所以状态模式就出来了~

好处与用处

好处:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
就是说将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个concrete state中,所以通过定义新的子类可以很容易地增加新的状态和转换。

目的:
消除庞大的条件分支语句,通过把各种状态转移逻辑分布到state的子类之间,来减少相互间的依赖。

应用

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

代码展示

注意:
有过长分支判断语句的工作类:×

public 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 < 21)
                    {
                        Console.WriteLine("当前时间:{0}点 加班,好累", hour);
                    }
                    else
                    {
                        Console.WriteLine("当前时间:{0}点 太困了。睡着了", hour);
                    }

                }
            }
        }
    }

调整后的work类:

public class Work
    {
        private State current;
        public Work()
        {
            current = new ForenoonState();
        }

        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);
    }

客户端代码:

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.WriteProgram();

            emergencyProjects.TaskFinished = false;

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

        }
    }

效果图:

状态模式

后记

直接跟着状态模式敲,可能逻辑会出现错误,可以从小菜开始的时候就跟上他的步伐,一步一步将它改好~

猜你喜欢

转载自blog.csdn.net/carrie_q/article/details/80559525