abstract class State
{
public abstract void Execute(Context context);
}
class StateA : State
{
public override void Execute(Context context)
{
if (context.filter == "+")
{
Console.WriteLine("此时执行加法运行");
}
else
{
context.State = new StateB();
}
}
}
class StateB : State
{
public override void Execute(Context context)
{
if (context.filter == "-")
{
Console.WriteLine("此时执行减法运行");
}
else
{
context.State = new StateC();
}
}
}
class StateC : State
{
public override void Execute(Context context)
{
if (context.filter == "*")
{
Console.WriteLine("此时执行乘法运行");
}
else
{
context.State = new StateD();
}
}
}
class StateD : State
{
public override void Execute(Context context)
{
if (context.filter == "/")
{
Console.WriteLine("此时执行除法运行");
}
else
{
context.State = new StateF();
}
}
}
class StateF : State
{
public override void Execute(Context context)
{
if (context.filter == "++")
{
Console.WriteLine("此时执行连加运行");
}
else
{
context.State = new StateG();
}
}
}
class StateG : State
{
public override void Execute(Context context)
{
Console.WriteLine("传入的不是‘+-*/’,该抛异常");//抛异常了,该终止了
}
}
class Context
{
public string filter = "+";
private State state;
public Context()
{
state = new StateA();
}
public State State
{
get
{
return state;
}
set
{
this.state = value;
Handle();
}
}
public void Handle()
{
state.Execute(this);
state = new StateA();//状态回归默认,
}
}
//前端
static void Main(string[] args)
{
Context c = new Context();
c.filter = "a";
c.Handle();//如果状态不回复默认,那么Context的state永远为stateG,下面执行就会得不到想要的
c.filter = "*";//
c.Handle();
Console.ReadLine();
}
总结:状态模式其实就是把对象的各种状态抽离出去成为一组相互独立可互相替换的对象,各个状态中满足条件则执行当前行为,不满足则转入下一个状态。
类似于策略模式,不过策略模式是客户指定当前执行某一策略,状态模式是默认执行某一状态,然后在状态中判断不符合要求就自动转下一个状态。
优点:避免了if else判断,维护起来方便,扩展起来方便,符合单一原则。
缺点:环境类和状态类互相依赖;各个条件分散成不同的类,看起来不直观,并且如果有新的状态加入,需要修改最后的状态类(改动很小)。不过比起庞大的条件语句块,这些缺点都可以忽略。
创新互联公司坚持网页设计,我们不会倒闭、转行,已经持续稳定运营十多年。专业网站建设公司技术,丰富的成功经验和创作思维,提供一站式互联网解决方案,携手广大客户,共同发展进步。我们不仅会设计网站,更会营销型网站建设。帮助中小型企业在“互联网+"的时代里通过推广营销传播路线转型升级,累计帮助多家客户实现网络营销化,与我们一起携手共创未来!