状态模式使用方法

时间:2013-03-25 03:20:11

标签: c# func state-machine

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

private Action<Input> 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<xxx> State1() {
    if( i ... )
        return State1;
    else
        return State2;
}

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

3 个答案:

答案 0 :(得分:4)

如果您想使用返回void的函数,请尝试使用Action

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

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

public delegate State<T> State<T>(T input);

private State<int> State1(int input) {
    if( ... )
        return State1;
    else
        return State2;
}

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

答案 1 :(得分:1)

您可能需要查看this article,其中讨论了使用yield语句执行状态机。这是commonly done,例如in the Unity3d game engine。 (另一个讨论here

答案 2 :(得分:0)

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

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

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