使用状态模式构建复杂状态的最佳方法?

Best way to construct complex states with state pattern?

我有一个可以处于不同状态的菜单,所以我决定使用状态模式。在线阅读有关该模式的信息似乎通常的方法是从另一个状态构造状态,但这对我不起作用,因为我有更复杂的状态需要其他依赖项。我可以在上下文对象中预先创建所有状态,然后从上下文对象切换状态,但我还需要来自先前状态的一些信息,所以它也变得混乱。

     class State1 {
         public State1(Context context, /*some complex constructor*/) {
         }
         public void Action() {
            //Something happend and we want to transition to other state
               
            //Usual way 
            //this will not work because state1 doesnt have 
            //dependencies to construct state2
            //context->SetState(new State2());
            

            //My current way
            //This is better because it works, but you will have to create
            //such functions for every state and context object needs to be 
            //modified if new states are added which is not ideal
            context->SetState2(/*something produced by action in state1*/);
         }
     }   

    class State2 {
         public State2(Context context, /*some complex constructor*/) {
         }
     }   
     
     
    class Context {
      //has current state 
    }

这是不是设计不好的迹象?
是否有一个干净的解决方案,或者我对此想得太多了?

OP 中的代码遗漏了一个重要细节,即状态设计模式中的状态是多态的(所有状态共享 API)。

class State1 implements State {}
class State2 implements State {}
class Context { private volatile State currentState; }

如果没有多态状态,就没有状态设计模式。实例化状态应该以与在 OO 应用程序中实例化任何其他业务对象相同的方式处理,即根据依赖倒置原则。考虑到这些事情......在状态模式中有 状态之间的转换。

一种方法是在 Context 内管理转换。在这种情况下,状态彼此分离:一个状态不知道其他状态的存在。 Contexthandle()(或 action())方法 returns 之后启动转换(如果需要)。这并不一定意味着 Context 知道具体的 State 实现。 Context 可能只有一个状态对象列表,并从一个对象过渡到下一个对象。

另一种方法是通过将每个状态链接到其后继状态来管理转换:每个状态在其构造函数中采用另一个(抽象的)状态。当它想要转换时,它会在 Context 上设置继任者。在这种情况下,Context 不知道转换逻辑,也不知道有多少状态可用。