2014-02-28 74 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." 
} 
} 

所以不知何故,我的控制器必須知道什麼時候到了,並調用View的函數getPlayersChoice。我看到的唯一方法是: 1)模型需要一些用戶輸入 2)模型告訴控制器:「嘿,給我輸入!」 3)控制器說「好」,並調用view.getPlayersChoice 4)控制器給模型輸入

但同樣,模型應該對控制器和視圖一無所知。 那麼,我該如何解決這個問題呢? 感謝您的幫助

附: 我有一個想法:也許我應該創建類似事件的事情,並將其作爲參數傳遞,如observer.update(eventThatHappened)。視圖獲取事件,調用適當的方法,但控制器的工作是決定用戶何時輸入信息以及何時應該顯示信息。

+0

'if(choice =='y'||'n')'不會做你認爲它做的! –

+0

哎呀,謝謝你指出,我會更新我的帖子。 – eoLithic

回答

0

,可以實現嚴格MVC或MVC實況2009建築圖案時要使用的worklow是:

  • 視圖查詢控制器
  • 控制器詢問模型做一些處理
  • 控制器通知視圖

由於視圖知道控制器,但相反是不正確的,我用來實現主題/觀察者模式來從控制通信回到視圖。

因此,你必須:

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

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

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

我希望這可以幫助您解決問題。

最好的問候,