为 FSM 中的状态转换提供参数的最佳方式
Best way to provide params to a state transition in a FSM
我所处的情况是,我的 FSM 中的一个状态需要来自外部世界的一些信息来完成它的工作。请求转换时需要提供此信息。完成此任务的最佳方法是什么?此时我正在使用 FSM class 作为黑板来在状态之间共享信息。
一个非常肮脏的解决方案可能是将此信息缓存在 FSM 中并在请求转换之前填充它,然后让状态从 FSM 黑板上获得它。不太喜欢。
我的语言是 C#
干杯。
通过委托来说明我的意思:
class MyStateMachine
{
private readonly Func<string> askForName;
public MyStateMachine(Func<string> askForName)
{
this.askForName = askForName;
}
// ...
void StateTransitionForActionX()
{
var name = askForName();
// ...
}
}
public MyStateMachine CreateMachine()
{
return new MyStateMachine
(
() =>
{
Console.WriteLine("Please, enter your name: ");
return Console.ReadLine();
}
);
}
当然,这可以用于任何数据请求 - 使用控制台似乎是一种简单的方式来说明这个想法 :) 尤其是闭包可以非常强大。
我所处的情况是,我的 FSM 中的一个状态需要来自外部世界的一些信息来完成它的工作。请求转换时需要提供此信息。完成此任务的最佳方法是什么?此时我正在使用 FSM class 作为黑板来在状态之间共享信息。
一个非常肮脏的解决方案可能是将此信息缓存在 FSM 中并在请求转换之前填充它,然后让状态从 FSM 黑板上获得它。不太喜欢。
我的语言是 C#
干杯。
通过委托来说明我的意思:
class MyStateMachine
{
private readonly Func<string> askForName;
public MyStateMachine(Func<string> askForName)
{
this.askForName = askForName;
}
// ...
void StateTransitionForActionX()
{
var name = askForName();
// ...
}
}
public MyStateMachine CreateMachine()
{
return new MyStateMachine
(
() =>
{
Console.WriteLine("Please, enter your name: ");
return Console.ReadLine();
}
);
}
当然,这可以用于任何数据请求 - 使用控制台似乎是一种简单的方式来说明这个想法 :) 尤其是闭包可以非常强大。