• 状态模式


    状态模式(State),其含义是允许一个对象在其内部状态改变时改变它的行为。
    对象看起来似乎修改了它的类。
    书中的例子是Tcp连接的状态,处于Established,Listening,Closed等,当一个连接对象收到其他对象的请求时,根据自身的当前状态做出不用的反应。又或者一个人在心情不同的时候对待同一件事会有不同的做法。
    以状态为原子来改变它的行为,而不是通过行为来改变状态呢?于是你就学到了状态模式。

    其适用性:

    一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为,

    一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

    这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的条件结构。

    State模式将每一个条件放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象儿独立变化。

    代码1:状态

     //抽象状态
        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);
            }
        }
    

    代码2:环境代码

       //工作
        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);
            }
        }
    

    代码3:客户端代码

    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.WorkFinished = true;
                emergencyProjects.TaskFinished = false;
    
                emergencyProjects.WriteProgram();
                emergencyProjects.Hour = 19;
                emergencyProjects.WriteProgram();
                emergencyProjects.Hour = 22;
                emergencyProjects.WriteProgram();
    
    
                Console.Read();
            }
        }
    

      

  • 相关阅读:
    宾得镜头资料
    先感动自己才能感动别人
    关于单反相机中的APSC
    K10D和凤凰镜头
    Vista的新快捷键
    微软雅黑字体“演”字变“漠”字的bug
    Windows XP无线零配置服务
    剑走偏锋,用XP的启动管理来搞定Vista、XP双系统
    BCB中的目录选择对话框的实现
    MagicAjax 使用
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/3359330.html
Copyright © 2020-2023  润新知