2013-02-28 41 views
3

我不知道這是否壞,讓視圖瞭解控制器,以便它可以委託視圖中發生的動作等,並讓控制器知道視圖(這顯然是正確的),但是它是雙向關係,我想知道是否正確?我想要在視圖中引用控制器,因爲我想將所有工作委託給控制器並保持視圖乾淨。這是不好的MVC設計?

這是不好的設計,如果是這樣,我可以做什麼不同,仍然實現相同?

控制器:

public class Controller { 

    private View view; 

    public Controller() { 
     view = new View(this); 
    } 

    public void doSomeButtonAction() { 
     // More code... 
    } 
} 

查看:可能派上用場後來是去除您Controller的構造函數依賴

public class View implements ActionListener { 

    private Controller controller; 
    private Button button; 

    public View(Controller controller) { 
     this.controller = controller; 

     // Code for initializing button reference etc. 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     controller.doSomeButtonAction(); 
    }  
} 
+0

看起來完全像它應該。如何查看*不知道控制器? – Affe 2013-02-28 18:44:33

+0

您可以通過控制器中的「視圖」參考開始訪問'getters',然後在控制器中附加事件監聽器等。那麼現在需要有一個參考。所以,是的,這個觀點可以在不知道控制器的情況下生活。 – LuckyLuke 2013-02-28 18:46:33

+0

它是一個可重用組件嗎?關於在編譯時定義按鈕實際上做了什麼的觀點,並沒有什麼固有的「壞」,而不僅僅是它們存在並等待在運行時向他人學習他們所做的事情。 「這個按鈕保存那行數據」是一個有效的視圖級別規範。 「這個按鈕是存在的,如果有人註冊了一個監聽器,可能會做一些事情」不夠有幫助:)。爲了它而添加另一個抽象層只是讓所有其他的東西難以閱讀! – Affe 2013-02-28 19:11:28

回答

0

一件事。將視圖作爲參數傳遞或使用setter。您的控制器不負責創建View。您的程序本身(例如Main)將負責創建它所需的View實施,並在創建Controller時注入它。如果您想使用模擬視圖或控制器,這也有助於測試。

您的觀點負責用戶程序交互。當它收到一些用戶輸入時,需要通知某個控制器,所以你必須有一個參考。然後View也應該有一個Controller字段的二傳手。通過這種方式,您可以構建兩者並相互傳遞。

+0

Okey,謝謝,這不是答案,但它是一個很好的提示,雖然:) – LuckyLuke 2013-02-28 18:44:57

+0

'這是不好的設計,如果是這樣,我可以做什麼不同,仍然達到相同的結果?' – 2013-02-28 18:45:36

0

你有一個總體思路:把邏輯(actionPerformed()的實現放到Controller中,View將有可見的小部件,例如面板中的按鈕,這看起來不像「MVC」我爲「VC」,在視線進制的數據模型。

沒有足夠的代碼在這裏,我把它稱爲「壞」,但。

+0

'actionPerformed()'的邏輯是'Controller#doSomeButtonAction()' – 2013-02-28 18:48:43

0

它不是一個MVC設計,MVC應分開模型,視圖和控制器層以獲得設計模式的好處

看起來您使用的是JSF,因此您的View和Controller類都是實體只是JSF中View層的一部分。您最好重命名爲PageAction,ViewFinder,ViewFrontController等。

+1

控制器應該是3層體系結構中Presentation(View)層的一部分。 – 2013-02-28 18:51:32

+0

我同意這一點。我不是說控制器不應該在演示文稿中。它不應該與你的視圖混合(webapp中的頁面視圖),我理解View類不是一個視圖,實際上是一個演示類,這就是爲什麼我建議將它重命名爲更有意義的內容,如PageAction,ViewFinder,ViewFrontController等。 – 2013-02-28 19:04:50

0

意見會有所不同,但是,我喜歡設計模型以便成爲應用程序層中的頂級客戶端,這意味着僅由容器(應用程序服務器+任何框架),當然不能是視圖或模型。爲了清晰和清晰,我遠離視圖組件直接與語言級別的控制器對象進行對話,而是通過協議使其通過容器。因此,如果網頁需要向Java Servlet提供額外請求,而不是直接調用Servlet,請向服務器提交HTTP(或任何其他協議)請求,並讓服務器將其路由到適當的控制器組件。通過這種方式,您可以在MVC的不同組件之間建立一個抽象層,這意味着您可以將一個組件與另一個組件解耦,並可以更輕鬆地更換一個組件,同時在需要時最小化其他組件。

所以我的答案是肯定的,這是一個觀點與控制器交談不好。實際上,我喜歡在設計MVC時依靠完整的inversion of control,因此沒有組件直接訪問另一個組件,但有一個由容器管理的抽象層。

0

指定什麼功能特定的按鈕執行是一個視圖級別的問題。控制器負責提供如何,但它不會向上講話以告訴視圖按鈕應該做什麼。視圖可以「知道」「這是一個調用保存操作的按鈕」。該觀點的全部目的是將人力投入轉化爲軟件操作!

如果你想要可重用的組件,你當然可以在其中添加另一個抽象層,但是指定按鈕執行什麼操作的代碼在概念上仍然是「視圖」的一部分,無論你在哪裏粘貼。