1、概念
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。主要解决,当一个对象状态转换的条件表达式过于复杂时把状态的判断逻辑转移到表示不同状态的一系列类当中。将复杂的逻辑判断简化。
2、模型
有三个角色,
State——抽象状态类,封装一个与特定状态相关的行为。
CreateState——具体状态,实现一个特定状态的行为。
ConText——维护一个CreateState实例,该实例是根据状态传入的。
程序实现:
public abstract class State
{
public abstract void Behavior(ConText conText);
}
public class CreateStateFirst:State
{
public override Behavior(ConText conText)
{
conText.state = new CreateStateSecond();
}
}
public class CreateStateSecond:State
{
public override Behavior(ConText conText)
{
conText.state = new CreateStateFirst();
}
}
public class ConText
{
private State state;
public ConText(State diffrentState)
{
state=diffrentState;
}
public State CurretState
{
set{state=value;}
get{return state;}
}
public void DealWith()
{
state.Behavior(this);
}
}
static void Main(String[] args)
{
Context conText = new ConText(new CreateStateFirst());
conText.DealWith();
}
这样将各个状态对应的行为分开来(CreateStateFirst,CreateStateSecond),它们由ConText负责维护。
下面以一个项目中的小例子看一下状态模式的应用。需求:根据每天不同的时间切换软件的皮肤颜色,以模型表示。
颜色抽象状态类:
public abstract class ColorState
{
public abstract void ShowColorSkinFile(SoftWare softWare);
}
public class MorningColor:ColorState
{
public override ShowColorSkinFile(SoftWare msoftWare)
{
if(msoftWare.time<12)
{
ConSole.writeLine("早晨的软件皮肤");
}
else
{
msoftWare.SetColorState(new AfterNoonColor());
}
}
}
public class AfterNoonColor:ColorState
{
public override ShowColorSkinFile(SoftWare msoftWare)
{
if(msoftWare.time<18)
{
ConSole.writeLine("下午的软件皮肤");
}
else
{
msoftWare.SetColorState(new EveningNoonColor());
}
}
}
public class EveningNoonColor:ColorState
{
public override ShowColorSkinFile(SoftWare msoftWare)
{
if(msoftWare.time<24)
{
ConSole.writeLine("晚上的软件皮肤");
}
else
{
msoftWare.SetColorState(new MorningColor());
}
}
}
public class SoftWare
{
private ColorState state;
public SoftWare()
{
state=new CommonColor();
}
public int Time
{
set;
get;
}
public void SetColorState(ColorState cState)
{
state=cState;
}
public void Show()
{
state.ShowColorSkinFile(this);
}
}
static void Main(String[] args)
{
SoftWare softe = new SoftWare();
softe.Time =8;
softe.Show();
softe.Time =14;
softe.Show();
softe.Time =20;
softe.Show();
}
分别显示:早中晚的颜色。