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();
}
⑤运行结果