Шаблон проектирования для навигации по меню (на c / c ++) - PullRequest
3 голосов
/ 16 ноября 2011

Можете ли вы порекомендовать шаблон проектирования или стратегию для элегантной обработки экранной навигации по меню?

Где «На основе экрана» означает серию взаимосвязанных полноэкранных «страниц» с кнопками, которые ссылаются на другие «Экраны» - как, например, в пользовательском интерфейсе игры.

Я реализовал шаблон проектирования на основе состояния, который я не рекомендую.
Код быстро запутывается и становится подверженным всевозможным ошибкам, основанным на состоянии, которые все труднее проверять.

Например:

void Update(float dt)
{
    switch(curState)
    {
        case kScreenA:
            ScreenA.Update(dt);
            if(ScreenA.IsDone())
                curState = kScreenB;
        break;
        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...
            }
     }
}

Также при таком подходе вам может понадобиться обработать условия входа:

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

Так что, должно быть, есть лучший способ спроектировать это, можете ли вы описать лучший способ?

Приветствия
slushduck

Ответы [ 2 ]

2 голосов
/ 09 мая 2016

Для простой системы меню вы можете использовать State Design Pattern.Создайте интерфейсное меню и реализуйте его с помощью конкретных классов (FirstMenu, SecondMenu и т. Д.).Создайте MenuContext, который рисует меню и имеет ссылку на текущее выбранное меню.Используя это выбранное меню, ContextMenu знает, как делегировать вызовы соответствующему меню.Вы можете создать элегантное дерево меню, используя шаблон состояния.https://en.wikipedia.org/wiki/State_pattern

0 голосов
/ 16 ноября 2011

Обычный способ реализации GUI - это использование MVP или ведущий вначале .Если ваше меню сложное с несколькими экранами, вам нужно несколько трио MVP.

...