状态模式
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,是上午!