2014-06-22 62 views
-1

從我一直在尋找使用java的MVC的真正解釋和實現,但我注意到的是,每個人都以不同的方式實現它,所以如果你給我一個有用的鏈接或電子書關於這一點,我需要這些問題需要回答:MVC在JAVA中的真正實現

  • 如何告知的變化模式發生的觀點,因爲模式是可觀察的adnd不觀察員?
  • 如何通知集合上發生更改的視圖(將項目添加到arraylist),因爲添加項目將發生在控制器處理程序上,並且控制器不可觀察。
  • 在大型項目中使用MVC是必須的嗎?
+2

該模型可以是可觀察*和*觀察者。此外,模型的更改將由控制器觸發,但更改將在模型中發生,並且模型可以通知視圖。 – Smutje

+2

理解「模型 - 視圖 - 控制器」是一個根據理論很少實際實現的概念是很重要的,而且爲了更貼近地理論,代碼經常嚴重失真。用它作爲一般的結構概念,但不要讓尾巴搖擺狗。 –

+1

模型 - 視圖 - 控制器變得如此時尚,人們覺得他們不得不說他們正在實施它,即使他們不理解它或正在寫一些它不適用的東西。由於我們行業處罰人們承認他們不瞭解當前的流行趨勢,因此許多人對於聲稱是MVC描述的東西進行了粗略的(或更少的)閱讀,然後繼續指導其他人等。我建議您瞭解基本的作爲優秀軟件設計的想法,並且能夠爲求職面試提供一個學術描述,而不用擔心。 – arcy

回答

0

的基本思想是:

  1. 觸發變更可以是控制器 (=響應於用戶輸入,例如鍵盤/鼠標點擊代碼),或應用 決定。例如。如果您有顯示價格的文本字段,則更改該字段的觸發器可能是明確的用戶輸入或來自銀行的消息。
  2. 每個這樣的觸發器都會更新模型(僅限模型)。 在我的價格示例中,它會更改模型(即支持文本字段)。
  3. 在變 - 我們的模型觸發事件,這使視圖重新渲染

因此,爲了您的第一個問題:有沒有必要「通知改變發生在視圖中的模型」。這個觀點不應該自行改變。關閉的東西是鍵盤/鼠標點擊,這將調用CONTROLLER。 對於第二個問題:「如何通知觀察集合上發生的變化」 - 集合應該在模型中。然後,控制器會執行「model.addItem」,它將激發視圖的事件

關於在大型項目中的使用......您可能會對它有不同的看法。 「原子」組件很可能嚴格遵循此模式(按鈕,文本字段或類似的自定義組件)。辯論的內容是關於複雜/複合數據的較大規模。例如。如果我的主要邏輯駐留在數據庫上,如何通知各種屏幕某些變化。屏幕和數據庫都會保存複雜的複合數據(例如用戶,他的產品推薦和購物車),並且您需要決定事件的粒度:在我爲應用程序層定義的一些簡單應用程序中發送「實體級事件」 (比如'用戶改變','產品改變'),UI層直接註冊到了它,因此它不是100%經典的MVC。在其他情況下,我不費吹灰之力建立一個精確反映屏幕數據的複合模型。

0

對於第一部分,我建議您從Wikipedia頁面開始Model–view–controller。你會找到一個體面的解釋和其他鏈接。

對於你的第一個問題,你只需要考慮工作流程。與用戶的交互發生在視圖中。然後,在用戶的操作中,控制器接受輸入,optionnaly重新格式化,並以模型已知的格式將其傳遞給模型。理論上,模型會更新視圖(在Web應用程序中,控制器從模型中收集數據並將其傳遞給視圖,因此更新模型 - >視圖是間接的)。

對於第二種情況,如果您處於模型可以直接更新視圖(桌面應用程序或專用組件(如Java applets))的情況下沒有問題。如果模型不能直接更新視圖(在Web應用程序中是典型的),則更新將在下次交互時可見。事實上,恰恰是這種情況發生時,當你看到一個網頁,儀表顯示的值始終是最新的:瀏覽器通過JavaScript或html元標籤指示,以短時間刷新其狀態。但是當你說添加一個項目時,這將發生在控制器處理程序上,這僅僅是由於來自用戶的交互(並且該視圖知道它必須更新其狀態或者被指示做所以通過控制器)。但該模型可以通過許多其他方式進行修改,其他用戶的交互,實時探測,後臺操作等。

第三個問題是有點意見。事實上,關注點的分離被認爲是一個好的設計,因爲不同的層可以獨立開發和測試(在某種程度上)。這種分離允許在一層中改變技術而不改變其他層(即使這通常是理論上的)。但恕我直言,最大的好處是你有很多實現MVC模式的框架。選擇一個,鍋爐板代碼的最大部分將由框架提供,而無需編寫和測試。所有這些都減少了開發時間和錯誤的可能性。

我的結論是(像其他人在他們的評論中說的)重要的是理解理論和MVC模式的理論優勢和關注點的分離。然後根據您的開發環境和您的環境(技術認識或允許)選擇一個框架,它可以豁免您編寫鍋爐板代碼,並花費節省的時間仔細分析所有功能以及用戶的期望。