码农小白 设计模式篇 状态模式

状态模式

1、状态的认识

世界万物皆有状态
人有着许多状态
如心情方面的:开心、快乐、沮丧、悲伤等
如生活方面的:运动、工作、休息、旅行等

时间也有这许多状态
如:上午、下午、晚上等

怎么能通过代码实现状态的切换呢?
在这里插入图片描述

2、面向过程思维的代码实现

class Program
{
	public static void GetTimeState(int time)    //获取时间状态
	{
        if(time >= 7 && time <12)
        {
            Console.WriteLine("现在是上午!");
        }
        if (time >= 12 && time < 17)
        {
            Console.WriteLine("现在是下午!");
        }
        if (time >= 17 || time < 7)
        {
            Console.WriteLine("现在是晚上!");
        }
    }
    static void Main(string[] args)
    {
        GetTimeState(7);
        GetTimeState(17);
        GetTimeState(21);
        GetTimeState(5);
        GetTimeState(14);
        GetTimeState(12);
    }
}

显示结果

现在是上午!
现在是晚上!
现在是晚上!
现在是晚上!
现在是下午!
现在是下午!
小结:

虽然用了一个方法来实现对,调用方法即可实现状态的切换,但没有用面向对象思维进行编程,对项目后期的编写会造成一定的影响(太多方法扎堆,很难找到想要调用的方法)

3、面向对象实现

class Program
{
    static void Main(string[] args)
    {
        MTime beijing = new MTime("北京");
        beijing.M_time = 8;
        beijing.GetTimeState();
        MTime Washington = new MTime("华盛顿");
        Washington.M_time = 20;
        Washington.GetTimeState();
        MTime Seattle = new MTime("西雅图");
        Seattle.M_time = 16;
        Seattle.GetTimeState();
    }
}
public class MTime    //时间类
{
    public MTime(string name)
    {
        this.name = name;
    }
    private string name;    //地名
    private int time;    //时间
    public int M_time
    {
        get { return time; }
        set { time = value; }
    }

    public void GetTimeState()
    {
        if (time >= 7 && time < 12)
        {
            Console.WriteLine("现在是{0}时间{1}点,是上午!", name, time);
        }
        if (time >= 12 && time < 17)
        {
            Console.WriteLine("现在是{0}时间{1}点,是下午!", name, time);
        }
        if (time >= 17 || time < 7)
        {
            Console.WriteLine("现在是{0}时间{1}点,是晚上!", name, time);
        }
    }
}

输出结果

现在是北京时间8点,是上午!
现在是华盛顿时间20点,是晚上!
现在是西雅图时间16点,是下午!
小结

抽象出时间类可实例化多个不同的对象,也可对其类进行添加不同的功能,但这种类只是返回了一个状态值,而它本身并未改变,与就是说:其实他还是一样

4、用状态模式实现

1、状态模式的简介

当一个对象状态改变时允许改变其行为,这个对象看起来像改变了其类

2、状态模式的好处

将与特点状态相关的行为局部化,并把不同状态的行为分割出来

3、状态模式的使用

当你不行通过客户端对其对象状态进行改变时,可以在达到某个条件时,使其自行改变相应的状态

4、代码实现

在这里插入图片描述

class Program
{
    static void Main(string[] args)
    {
        MTime mTime = new MTime(6);
        mTime.SetTime(16);
        mTime.SetTime(20);
        mTime.SetTime(6);
        mTime.SetTime(9);
    }
}
class MTime
{
    private TimeState m_State = null;
    public TimeState M_State
    {
        get { return m_State; }
        set { m_State = value; }
    }
    private int time = 0;
    public int M_Time
    {
        get { return time; }
    }
    public MTime(int value)
    {
        time = value;
        m_State = new Morning(this);
    }
    public void SetTime(int value)  //更新时间状态的方法
    {
        time = value;
        if (time < 0)    //确保时间正确
        {
            time = 0;
        }
        else if (time >= 24)    //确保时间正确
        {
            time = 0;
        }
        m_State.GrtState();
    }
}

//状态抽象类
abstract class TimeState
{
    protected MTime mTime;
    public TimeState(MTime m_Time)
    {
        mTime = m_Time;
        GrtState();
    }
    public abstract void GrtState();  //获取时间状态
}

//上午状态
class Morning : TimeState
{
    public Morning(MTime m_Time) : base(m_Time)
    {

    }
    public override void GrtState()
    {
        if (mTime.M_Time > 12 || mTime.M_Time < 7)    //时间不为7~11,切换状态
            mTime.M_State = new Afternoon(mTime);
        else
            Console.WriteLine("当前时间为:{0},是上午!", mTime.M_Time, this);
    }
}
//下午状态
class Afternoon : TimeState
{
    public Afternoon(MTime m_Time) : base(m_Time)
    {

    }
    public override void GrtState()
    {
        if (mTime.M_Time > 17 || mTime.M_Time < 7)    //时间不为12~16,切换状态
            mTime.M_State = new Evening(mTime);
        else
            Console.WriteLine("当前时间为:{0},是下午!", mTime.M_Time, this);
    }
}
//晚上状态
class Evening : TimeState
{
    public Evening(MTime m_Time) : base(m_Time)
    {

    }
    public override void GrtState()
    {
        if (mTime.M_Time >= 7 && mTime.M_Time < 17)    //时间不为17~23 && 0~6,切换状态
            mTime.M_State = new Morning(mTime);
        else
            Console.WriteLine("当前时间为:{0},是晚上!", mTime.M_Time);
    }
}

*输出结果

当前时间为:6,是晚上!
当前时间为:16,是下午!
当前时间为:20,是晚上!
当前时间为:6,是晚上!
当前时间为:9,是上午!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值