程序员的倔强,羊 了也要学习的设计模式——State_状态模式 《大话设计模式》

State_状态模式

PS:当下学习、工作,伴随着疫情的压力苦中作乐,当下举例仅一家之言,若有不妥,请联系删除。
状态:🐏、🐏过、🐏康、重🐏。当然,希望大家都是健健康康的,不要与🐏沾边。

1.概念
状态(State)模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

2.类图
在这里插入图片描述


3.代码分析
抽象出状态类State,并使用一个含状态转换条件的类Person与之聚合。

/// <summary>
/// 抽象状态类
/// </summary>
abstract class State 
{
   /// <summary>
   /// if内为当前状态,else内为下一个状态,状态迁移条件为🐏后天数
   /// </summary>
   /// <param name="person"></param>
   public abstract void Symptom(Person person);
}

根据不同状态对抽象状态类做具体实现YangState、YangGuoState、YangKangState、ChongYangState,并且在每个状态完成后,提供进入下一状态的入口。

/// <summary>
/// 🐏
/// </summary>
class YangState : State
{ 
   public override void Symptom(Person person) 
   {
       if (person.Day < 7)
       {
           Console.WriteLine("当前为第"+ person.Day +"天,状态为: 🐏。需要吃药、多喝水、多吃水果、多休息进行调理!\n");
       }
       else
       {
           person.SetNextSate(new YangGuoState());
           person.ShowPersonState();
       }
   }
}

/// <summary>
/// 🐏过
/// </summary>
class YangGuoState : State
{
   public override void Symptom(Person person)
   {
       if (person.Day >= 7 && person.Day < 8)
       {
           Console.WriteLine("当前为第"+ person.Day +"天,状态为: 🐏过。不需要吃药、但要多喝水、多吃水果、多注意休息,观察几天!\n");
       }
       else
       {
           person.SetNextSate(new YangKangState());
           person.ShowPersonState();
       }
   }
}

/// <summary>
/// 🐏康
/// </summary>
class YangKangState : State
{
   public override void Symptom(Person person)
   {
       if (person.Day >= 8 && person.Healthy)
       {
           Console.WriteLine("当前为第"+ person.Day +"天,状态为: 🐏康。正常作息即可,但是不要经常外出,注意安全!\n");
       }
       else
       {
           person.SetNextSate(new ChongYangState());
           person.ShowPersonState();
       }
   }
}

/// <summary>
/// 重🐏
/// </summary>
class ChongYangState : State
{
   public override void Symptom(Person person)
   {
       if (person.Day > 7 && !person.Healthy)
       {
           Console.WriteLine("当前为第n天,状态为: 重🐏。需要吃药、多喝水、多吃水果、多休息进行调理!\n");
       }
   }
}

编写含状态转换条件的类Person,且拥有初始化状态、状态转换条件、完成状态的标志、下一状态设置、状态作用(行为动作)展示等

/// <summary>
/// 含转换条件 和 含当前状态的类
/// </summary>
class Person 
{
    /// <summary>
    /// 当前状态 🐏
    /// </summary>
    private State currentState;
    public Person() 
    {
        this.currentState = new YangState();
    }

    /// <summary>
    /// 随着时间的推移,逐渐恢复健康
    /// </summary>
    private int day;
    public int Day
    {
        get { return day; }
        set { this.day = value; }
    }

    /// <summary>
    /// 恢复
    /// </summary>
    private bool healthy = false;
    public bool Healthy 
    {
        get { return healthy; }
        set { healthy = value; }
    }

    /// <summary>
    /// 设置下一个状态
    /// </summary>
    /// <param name="state"></param>
    public void SetNextSate(State state) 
    {
        currentState = state;
    }

    /// <summary>
    /// 人当前状态
    /// </summary>
    public void ShowPersonState() 
    {
        currentState.Symptom(this);
    }
}

实例化一个Person对象,让后通过改变状态转换条件实现状态之间的迁移

static void Main(string[] args)
{
    Person person = new Person();

    //🐏 的第五天,或7天内
    person.Day = 5;
    person.ShowPersonState();

    //一个礼拜过去了,正常情况 🐏过
    person.Day = 7;
    person.ShowPersonState();  
    person.Healthy= true;
    
    //第八天,正常🐏康
    person.Day = 8;
    person.ShowPersonState();

    //不知道第几天,出门去玩没带口罩,又 🐏了
    person.Healthy= false;
    person.ShowPersonState();

    Console.ReadKey();
}

⑤运行结果
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值