2014-02-28 4 views
1

Я пишу маленькую карточную игру, и я застрял. Просто некоторые основные: 1) вид наблюдает модель 2) контроллер решает, когда нужно показать окно вывода и когда показывать окно ввода 3) модель делает все математикаMVC: проблемы реализации в приложении командной строки

Ну, это выглядит как мой контроллер должен быть наблюдатель модели, что плохо и, насколько я знаю, также ошибочно.

Мое положение: наступает момент, когда пользователь должен сделать выбор и подтвердить его с помощью командной строки.

char View::getPlayersChoice 
{ 
while (cin>>choice) 
{ 
    if (choice == 'y' || choice == 'n') 
    controller.getPlayersChoice(choice) 
    else 
    cout<<"Invalid input. Please try again." 
} 
} 

Так или иначе мой контроллер должен знать, когда пришел момент и вызвать представление в функции getPlayersChoice. И единственный способ, которым я это вижу: 1) модель нуждается в некотором вводе пользователя 2) модель сообщает контроллеру: «Эй, дайте мне вход!» 3) контроллер говорит «ОК» и вызывает view.getPlayersChoice 4) контроллер дает ввод в модель

Но опять-таки модель не должна ничего знать о контроллере и виде. Итак, как мне решить эту проблему? Спасибо за помощь

P.S. Есть идея, которую я имею: возможно, мне нужно создать что-то вроде событий и передать ее как аргумент, например observer.update(eventThatHappened). Просмотр получает событие, вызывает соответствующий метод, но задача контроллера заключается в том, чтобы решить, когда пользователь должен вводить информацию, и когда он должен показывать что-то.

+0

'если (выбор == 'у' || 'п')' не делать то, что вы думаете, что делает! –

+0

Упс, спасибо за это, я обновлю свой пост. – eoLithic

ответ

0

worklow, которые могут быть использованы при осуществлении строгого MVC или MVC-живой architecural картина:

  • мнение запрашивает контроллер
  • Контроллер запрашивает модель, чтобы сделать некоторую обработку
  • The извещает контроллер вид

Поскольку представление знает контроллер, но противоположное не соответствует действительности, я использую для реализации шаблона субъекта/наблюдателя для связи с контроллером r к виду.

Таким образом, у вас есть:

class View 
{ 
    void doSomething() 
    { 
    controller.requestDoSomething(); 
    } 

    void onProcessingSuccessEvent() 
    { 
    // do stuff (for example read model) 
    } 
}; 

class Controller 
{ 
    void requestDoSomething() 
    { 
    model.process(); 
    ... 
    notify(ProcessingSuccessEvent); 
    } 
} 

Я надеюсь, что это может помочь вам с вашей проблемой.

С наилучшими пожеланиями,

Смежные вопросы