Administrator
发布于 2024-08-01 / 27 阅读
0
0

状态模式

问题描述

假如我们要描述员工一天的工作状态,使用状态模式来实现。

代码实现

State类

    public abstract class State
    {
        public abstract void WriteProgram(Work work);
    }

具体状态类

public class ForenoonState : State
{
    public override void WriteProgram(Work work)
    {
        if (work.Hour < 13)
            Console.WriteLine($"当前时间:{work.Hour} 点,饿了,午饭;困了,午休");
        else
        {
            work.SetState(new AfternoonState());
            work.WriteProgram();
        }
    }
}

public class AfternoonState : State
{
    public override void WriteProgram(Work work)
    {
        if (work.Hour < 17)
            Console.WriteLine($"当前时间:{work.Hour} 点, 下午状态不错,继续努力");
        else
        {
            work.SetState(new EveningState());
            work.WriteProgram();
        }
    }
}
public class EveningState : State
{
    public override void WriteProgram(Work work)
    {
        if (work.GetFinished())
            work.SetState(new RestState());
        else
        {
            if (work.Hour < 21)
                Console.WriteLine($"当前时间:{work.Hour} 点,加班哦,疲累之极");
            else
            {
                work.SetState(new SleepingState());
                work.WriteProgram();
            }
        }
    }
}




public class RestState : State
{
    public override void WriteProgram(Work work)
    {
        Console.WriteLine($"当前时间:{work.Hour} 点,下班回家了");
    }
}


public class  SleepingState : State
{
    public override void WriteProgram(Work work)
    {
        Console.WriteLine($"当前时间: {work.Hour} 点,睡觉了");
    }
}

上下文类

    public class Work
    {
        private State mCurState;
        public Work()
        {
            mCurState = new ForenoonState();
        }
        public int Hour { get; set; }

        private bool mFinished = false;
        public bool GetFinished()
        {
            return mFinished;
        }

        public void SetFinished(bool finished)
        {
            mFinished = finished;
        }
        public void SetState(State state)
        {
            mCurState = state;
        }

        public void WriteProgram()
        {
            mCurState.WriteProgram(this);
        }
    }

Main方法:

    internal class Program
    {
        static void Main(string[] args)
        {
            Work work = new Work();
            work.Hour = 9;
            work.WriteProgram();

            work.Hour = 10;
            work.WriteProgram();

            work.Hour = 12;
            work.WriteProgram();

            work.Hour = 13;
            work.WriteProgram();

            work.Hour = 14;
            work.WriteProgram();

            work.Hour = 17;
            work.WriteProgram();

            work.SetFinished(false);
            work.WriteProgram();

            work.Hour = 19;
            work.WriteProgram();

            work.Hour = 22;
            work.WriteProgram();

        }
    }

执行结果:

当前时间:9 点,饿了,午饭;困了,午休
当前时间:10 点,饿了,午饭;困了,午休
当前时间:12 点,饿了,午饭;困了,午休
当前时间:13 点, 下午状态不错,继续努力
当前时间:14 点, 下午状态不错,继续努力
当前时间:18 点,加班哦,疲累之极
当前时间:18 点,加班哦,疲累之极
当前时间:19 点,加班哦,疲累之极
当前时间: 22 点,睡觉了

UML图


评论