一、状态设计模式的特点
当一个对象内部具允许有多个状态改变时,我们将不同的状态提取出来作为一个单独的类来描述一个状态,这样可以很容易的扩展对象,使其具有更多的状态表达,而不会影响到对象本身。
一个状态模式的结构图:
State作为一个抽象接口类,向外界提供一个对象,而派生类继承自State实现接口作为不同的状态表示。
Context是一个状态调配类,它根据客户端传递过来的指令判断对象需要执行那种状态,而指定创建那个子类的实例接口。从而实现状态的改变。
二、状态模式的实现
1、在实际生活中我们可以我们的工作看成一个状态模式,在不同的时间段的工作的状态不同。
2、状态模式的代码实现
using System;
/*
zhong de zhuang tai jie kou
*/
abstract class State
{
public abstract void Handle (Context context);
}
class ConcreteStateA :State
{
public override void Handle (Context context)
{
if (context.Hourr < 12) {
Console.WriteLine ("Is work");
} else {
context.Request (new ConcreteStateB ());
context.WriteProgran ();
}
}
}
class ConcreteStateB :State
{
public override void Handle(Context context)
{
if (context.Hourr < 13) {
Console.WriteLine ("Lunch take a nap.");
} else {
context.Request (new ConcreteStateC ());
context.WriteProgran ();
}
}
}
class ConcreteStateC :State
{
public override void Handle(Context context)
{
Console.WriteLine ("Home from work");
}
}
//zhuang tai tiao pei
class Context
{
private State state;
//chu shi gong zuo zhuang tai
public Context()
{
state = new ConcreteStateA ();
}
/*ji lu shi jian de zhuan huan*/
private double hourr;
public double Hourr
{
get{ return hourr;}
set{ hourr = value;}
}
//geng gai dang qian zhuang tai
public void Request(State se)
{
state = se;
}
public void WriteProgran()
{
state.Handle (this);
}
}
class WinMain
{
public static void Main(string[] args)
{
Context c = new Context ();
c.Hourr = 9;
c.WriteProgran ();
c.Hourr = 12;
c.WriteProgran ();
c.Hourr = 17;
c.WriteProgran ();
Console.ReadKey ();
}
}
运行结果: