C# 设计国家链

C# 设计国家链,c#,java,architecture,oop,C#,Java,Architecture,Oop,我想建立一种FSM(有限状态机)模型。我有一系列的状态(比如说,从StateA到StateZ)。该序列称为链,在内部作为列表实现。我将按运行顺序添加状态 我的目的是能够在我的计算机中执行一系列操作(例如,鼠标单击)。(我知道这已经做了无数次了) 因此,状态被定义为: 布尔前提条件()); 最大的问题是我想引用一个目前还没有定义的状态。我可以通过在重定向到状态时使用字符串和使用内部哈希表来避免这个问题,但是没有更清晰的替代方法吗 我只能在构造函数中传递前置条件和失败状态,让链在执行前将公共属性中

我想建立一种FSM(有限状态机)模型。我有一系列的状态(比如说,从StateA到StateZ)。该序列称为链,在内部作为列表实现。我将按运行顺序添加状态

我的目的是能够在我的计算机中执行一系列操作(例如,鼠标单击)。(我知道这已经做了无数次了)

因此,状态被定义为:

  • 布尔前提条件()
    ); 最大的问题是我想引用一个目前还没有定义的状态。我可以通过在重定向到状态时使用字符串和使用内部哈希表来避免这个问题,但是没有更清晰的替代方法吗


    我只能在构造函数中传递前置条件和失败状态,让链在执行前将公共属性中正确的下一个状态放入每个状态,但这似乎有点尴尬。

    您可以执行以下操作之一:

    • nextState
      定义为Sta
      t
      e类中的可变字段,然后使用一个mutator连接状态;e、 g.
      setNextState
      setNextState
      方法可以实现为只允许调用一次;后续调用将导致抛出
      IllegalStateException
    • 更改
      状态
      接口,仅返回是否满足某个前提条件(即返回一个
      布尔值
      ),并在满足前提条件时使用外部“协调器”类沿列表进行转换。换句话说,你知道下一个状态在索引i+1,因此每个状态都不需要明确知道它的后续状态

    考虑到您的状态机的简单性,我倾向于第二种方法。

    这是装饰器模式的完美候选。下一步装饰(包装)当前步骤。你可以构建整个国家链。

    我非常同意@Adamski的第二点。除非您计划将状态作为图算法进行遍历,而不是使用外部中介来管理遍历,否则状态不需要位置意识到它们自己

    如果你真的对状态感兴趣,那么你可以用一棵树来表示(即使它现在是完全线性的)来回答你关于
    新的问题
    
    Chain chain = new Chain();
    //chain.AddState(new State(Precondition, FailState, NextState) <- Method structure
    chain.AddState(new State(new WinampIsOpenCondition(), null, new <problem here, I want to referr to a state that still wasn't defined!>);
    
    public State PreviousAction { get; set; }
    public IList<State> States { get; private set }
    public void QueueAction(State CurrentAction)
    {    
        if(PreviousAction != null)
        {        
            States.Add(new State(PreviousAction, CurrentAction)        
        }
    
        PreviousAction = CurrentAction;    
    }
    
    public void Execute()
    {    
        States.Add(new State(PreviousAction, State.Terminator));
    
        States[0].Execute();    
    }