2011-03-08 45 views
2

我正在學習「練習」中的MVC模式,這意味着我正試圖掌握如何在任何給定的Java應用程序中實現它。我剛剛通過另一個question得到了一點智慧,我跟進了這裏。可以讓控制器在應用MVC模式時繼承視圖嗎?

MVC模式的本質是模型不應該知道視圖或控制器。但是,控制器和視圖都必須知道控制器很可能需要更新視圖,並且視圖需要將用戶操作發送給控制器。我知道一個人通常使用策略模式實現控制器,這意味着控制器是視圖的行爲。無論人們如何看待它,視圖和控制器都是相互交織在一起的。

現在,我知道一個人應該贊成組合而不是繼承。然而,在控制器繼承視圖的情況下創建一個設計是否有意義。我主要考慮不必在視圖上編寫大量的訪問器和增變器方法,而是使用受保護關鍵字定義所有組件,以便子類可以訪問它們。

有人可能會認爲當用戶輸入發生時視圖應該能夠通知控制器。我的想法是讓控制器中的每個按鈕都有相應的操作。然後,它只是一個註冊正確的操作(在控制器,這是子類)與相應的按鈕(在視圖中)的問題。

我該如何模糊顧慮的分離?這仍然是MVC模式,還是我正朝着完全不同(甚至更糟糕)的方向前進?

所有的反饋是最歡迎的!

+0

你的目標是什麼?你想開發自己的MVC框架嗎? – CoolBeans 2011-03-08 20:09:40

+0

我的目標是瞭解如何在我的應用程序中利用MVC模式。從例子中我明白,理想的構成是將控制器設置爲視圖的「行爲」的方式。然而,它讓我感到震驚,讓任何一個控制器只是擴展視圖就很簡單。我承認它看起來很懶,但我認爲它是一種節省時間和代碼行的方法(不是說模式是什麼?)。畢竟,只要讓另一個繼承視圖,就可以很容易地改變「行爲」。 – sbrattla 2011-03-09 06:43:57

回答

4

當您的控制器擴展視圖時,從Java的角度來看,您的控制器是「一個」視圖。所以說在這種情況下你違反mvc模式是很安全的。

0

不,我不認爲它確定,對我來說這聽起來很糟糕。它在某些情況下可能會有所幫助,但它肯定不是MVC。

1

不要去那裏 - 它會變成一個M-VCS(Model-ViewControllerSpaghetti)架構。

原則上,我會說,用戶輸入(包括按鈕和其他控制)不屬於視圖,但到控制器(或到GUI層具有-一個控制器)而只有視圖顯示模型。

您的控制器GUI熟悉該視圖並通知該模型已更新並且應該重新顯示該模型是合理的。沒有訪問器和mutators是必要的。

+0

你是說GUI中唯一需要的方法是一個stateChanged()方法,當視圖需要更新它顯示的任何內容時,控制器可以在視圖上觸發這個方法?我剛剛看到很多例子,告訴我添加方法來啓用/禁用字段,鎖定/解鎖字段,讓控制器更新狀態... – sbrattla 2011-03-09 06:48:23

+0

如果我上面的評論是正確的,那麼這實際上意味着控制器永遠不能直接更新視圖,只能通知視圖需要更新它的狀態。但是,字段的啓用/禁用或鎖定/解鎖「邏輯」屬於視圖還是控制器? – sbrattla 2011-03-09 06:50:38

+0

讓模型通知控制器和更改視圖也是很常見的(實際上,這比控制器擺弄視圖更好)。無論如何,這種一般情況下很難具體說明。與各種模式一樣,MVC不是現成的,一刀切的魔法銀錘。你需要考慮到你想要達到的目標,然後根據你的問題量身定製解決方案。對不起,如果這是模糊的,但沒有「正確」的答案(正如你已經注意到的)。 – molbdnilo 2011-03-09 13:46:20

1

@Jan Galinski是正確的。如果你看一下examplepicture在你前面的問題中引用,你會看到Controller有-一個View,它有-一個Model,而在剛剛View-AModel(實線箭頭)。該Controller傾聽ViewView傾聽Model(虛線箭頭)。

附錄:通過這種方式,您可以看到類圖與代碼之間的一對一對應關係。

2

不要聽這些fuddy duddys。聽起來對我來說是一個偉大的計劃。

這是交易。

Controller「is-a」View是一個完整的,完整的細節,這對實現並不重要。只要沒有使用控制器將其用作View,那麼誰在乎Controller的類層次結構是什麼?

現在,通過從視圖中降序,那麼在理論上,開發環境不能使用需要View的Controller「意外」保護您。這隻會讓你更加小心。

它是否使您的控制器更多地依賴於視圖,而不是它與它具有「有-α」關係?八九不離十。它使得更換視圖變得更加困難,雖然後面有不同的視圖,但是您可以使用該事件作爲重構從「是 - 到」關係到「有-a」的動機。

可以說,通過這樣做,你只是在「懶惰」,但我會依賴程序員和懶惰拉里·沃爾。

從建模的角度來看,這根本就不是什麼大事,坦率地說是保存給學生。在操作上它沒有區別。

+1

我不是一個「fuddy duddy」......只是需要說的! – 2011-03-08 22:19:50

+0

聽到故事的兩面總是很棒!我的想法是,通過簡單地創建擴展視圖的第二個控制器,「行爲」(控制器)就可以輕鬆地進行更改/切換。但是,我確實意識到應該「贊成構成而不是繼承」......但是這並不意味着在實際使用時應該忽略繼承。我有點不願意使用「懶惰」這個詞,但我確實是管理員,我希望儘可能少地寫一些代碼以使其全部工作。 – sbrattla 2011-03-09 06:57:56

+0

我用「lazy」和「fuddy duddy」以可愛的方式:)。 – 2011-03-09 16:51:32