状态模式使用方法

我正在尝试使用方法作为状态而不是类来实现基于状态模式的修改版本的简单状态机,如下所示:

private Action currentState; private void NextState(Input i) { currentState(i); } private void State1(Input i) { if( i ... ) currentState = State1; else currentState = State2; } private void State2(Input i) { if( i ... ) currentState = State1; else currentState = State2; } 

但如果我能这样做会更优雅:

 private void NextState(Input i) { currentState = currentState(i); } private Func State1() { if( i ... ) return State1; else return State2; } 

但我不知道如何写这个Func 。 有没有办法做到这一点?

如果要使用返回void函数,请尝试使用Action

 private Action State1() {  if( ... )    return State1Inner;  else    return State2Inner; } 

如果要使用返回具有自己签名的函数的函数,则必须首先定义自定义委托类型。 这是一个通用版本:

 public delegate State State(T input); private State State1(int input) {  if( ... )    return State1;  else    return State2; } 

这将帮助您避免使用内部状态函数。

您可能希望看一下本文 , 该文章讨论了使用yield语句来执行状态机。 这通常在例如Unity3d游戏引擎中完成 。 ( 这里另一个讨论)

如果你想使用方法作为状态和一般“引用”它们,你需要函数指针。 我不熟悉c#中的语法,但在c ++中你可以传递指向函数的指针,并使用它的指针调用该函数。 这意味着使用函数作为参数/变量 – 将被使用的动作,但在运行时之前是未知的。

查看函数指针,我认为这会让你到达你需要的位置,虽然我很好奇你在这里所做的事情的本质。

如果你正在使用c#,它会使用一个叫做函数委托而不是指针的东西。 在这里阅读: http : //msdn.microsoft.com/en-us/library/ms173171.aspx