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判断,维护起来方便,扩展起来方便,符合单一原则。
缺点:环境类和状态类互相依赖;各个条件分散成不同的类,看起来不直观,并且如果有新的状态加入,需要修改最后的状态类(改动很小)。不过比起庞大的条件语句块,这些缺点都可以忽略。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。