菜单导航的设计模式(在c/C++中)

问题描述:

您可以推荐一个设计模式或策略来优雅地处理基于屏幕的菜单导航吗?菜单导航的设计模式(在c/C++中)

其中“基于屏幕”是指一系列相互连接的全屏“页面”,并带有链接到其他“屏幕”的按钮 - 例如在游戏的用户界面中。

我已经实现了一个基于状态的设计模式,我不建议这样做。
代码变得杂乱无章,变得越来越容易出现各种基于状态的错误,这些错误越来越难以测试。

如:

void Update(float dt) 
{ 
    switch(curState) 
    { 
     case kScreenA: 
      ScreenA.Update(dt); 
      if(ScreenA.IsDone()) 
       curState = kScreenB; 
     break; 
     etc... 
} 

通过这种方法,你最终需要处理的回报条件:

void InitState() 
{ 
    switch(nextState) 
    { 
     case kScreenC: 
      if(curState == kScreenA) 
       ScreenC.InitFromA(); 
      if(curState == kScreenB) 
       ScreenC.InitFromB(); 
      etc... 
    } 
} 

void Update(float dt) 
{ 
    switch(curState) 
    { 
     case kScreenA: 
      ScreenA.Update(dt); 
      if(ScreenA.IsDone()) 
      { 
       if(ScreenA.ReturnState == 1) 
        curState = kScreenB; 
       if(ScreenA.ReturnState == 2) 
        curState = kScreenC; 
       etc... 
      } 
    } 
} 
用这种方法,你可能最终需要处理进入条件

而且

所以必须有更好的方法来设计这个,你能描述一个更好的方法吗?

干杯,
slushduck

实现GUI的正常方式是使用MVPpresenter first。如果你的菜单比较复杂,那么你需要几个MVP三重奏。

对于简单的菜单系统,您可以使用状态设计模式。 创建一个界面菜单并使用具体的类来实现它(FirstMenu,SecondMenu等)。创建一个MenuContext,它绘制菜单并具有currentSelected菜单的引用。通过使用这个currentSelected Menu,ContextMenu知道将呼叫委托给适当的菜单。你可以使用状态模式来使用一个优雅的菜单树。 https://en.wikipedia.org/wiki/State_pattern