状态模式是把各种状态封装成不同的类。
关于Context类的实现,不太同于Strategy,虽然原理是一样的:
public class Context
{
private State stateA, stateB, state;
public Context()
{
stateA = new StateA();
stateB = new StateB();
}
public void Request(int temp)
{
if (temp > 0)
state = stateA;
else
state = stateB;
state.Handle();
}
}
可以看到,Request()方法是基于简单工厂的。{
private State stateA, stateB, state;
public Context()
{
stateA = new StateA();
stateB = new StateB();
}
public void Request(int temp)
{
if (temp > 0)
state = stateA;
else
state = stateB;
state.Handle();
}
}
还有,Context的ctor是基于单件模式的,可以使用注册工厂来简化。
在Client端的调动方式,就这么简单:
Context context = new Context();
context.Request(20);
context.Request(20);
基于委托的状态模式
委托部分:
public delegate void state();
public class ContextUseingDelegate
{
public state myState;
public void ContextInterface()
{
myState();
}
}
public class ContextUseingDelegate
{
public state myState;
public void ContextInterface()
{
myState();
}
}
我们需要在Context类中使用委托,而在Client端不变:
public class Context
{
public void Request(int temp)
{
ContextUseingDelegate cud = new ContextUseingDelegate();
if (temp > 0)
{
StateA sa = new StateA();
cud.myState += new state(sa.ConcreteStateA);
}
else
cud.myState += new state(StateB.ConcreteStateB);
cud.ContextInterface();
}
}
{
public void Request(int temp)
{
ContextUseingDelegate cud = new ContextUseingDelegate();
if (temp > 0)
{
StateA sa = new StateA();
cud.myState += new state(sa.ConcreteStateA);
}
else
cud.myState += new state(StateB.ConcreteStateB);
cud.ContextInterface();
}
}