問題1:如何控制器和視圖之間傳輸數據當你有 有這樣的層次?如果我將數據從父母傳遞給孩子,那麼 會有很多重複,如果我更換了一個孩子,所有父母都需要更改。我不希望視圖直接訪問數據庫中的 數據,我希望僅通過 控制器將數據傳輸到視圖。
如何忽略層次結構並通過向相關控制器註冊視圖來採用更線性的方法?數據可以通過模型獲得,其中可以通過Observer
或Listener
模式觸發更改。
有了這個,你不會有任何重複發生。一切都將集中在一個模型或一系列模型中。在發生用戶操作或外部事件後,控制器或控制器可以在註冊視圖列表上運行通知。
此外,視圖應該不會像你說的那樣訪問數據源。這裏應該至少有一個抽象層。如果您的控制器使用中介模式,我會做的是通過將請求轉發到額外數據層中的接口來處理此事。
進一步思考,我不認爲如果將已註冊通過視圖做一個好主意。所以我會保持分開。手動初始化視圖或找到一種方法遍歷所需的視圖。也許通過一種使這一步自動化的工廠來獲得你的觀點。
問題2:如何在這樣的 層次結構中將事件從視圖傳播到控制器?我正在考慮使用PropertyChangeListener。如果控制器需要採取任何措施,將會查看 firePropertyChange事件。 控制器將監聽這些事件並執行一些操作。但 再次如果我這樣做的層次結構,那麼會有代碼重複。
同樣,你可以通過一個線性方法。當一個視圖被註冊時,Controller可以添加它的監聽器。或者你可以讓視圖發送一些可以通過調度機制處理的語義風格消息(例如:doAction(「Save」))。會讓你決定如何轉發參數。
是否需要PropertyChangeListeners?我的意思是,你需要那種粒度嗎?
我有三個想法,可能是有用的:
要使用控制器每個面板,但這種以這種方式我會在最後 有很多的控制器。使用Mediator設計模式,將提供視圖和控制器之間的通信。使用中央 收件人&通知程序將從視圖中監聽所有屬性更改事件 ,並通知有興趣的控制器。但這 只能解決我的第二個問題:
這聽起來像隱約HMVC。通過這種方法,您可以爲每個子系統提供三元組模型視圖控制器。這是一個有趣的想法,但可能很混亂,不清楚應該如何解決層次結構以及協調/從屬關係如何實現。
也許你可以有第四個中性類應用的每個模塊/子系統在那裏你可以插入一個視圖,模型和控制器,如果他們中的一個缺失或不正確引發的異常。
或者,下面的這個想法中央通知的,你可以有作爲一個路由機制等特定功能的控制器或多個基本動作的中央控制器。如何將消息轉發給這些取決於你。由於集中化將使這個類的設計變得必不可少,所以請小心線程。
無論你做什麼,儘量讓事情儘可能簡單。您應該可以在模型和控制器上進行測試,而不必大驚小怪。
Marting Fowler發表了一系列有關演示架構的文章(沒有任何鏈接方便,對不起,但應該出現在搜索頂端附近:-) – kleopatra 2013-03-17 12:40:29
引用了一些_model-view-presenter_(MVP)鏈接[這裏](http://stackoverflow.com/a/15181906/230513)。 – trashgod 2013-03-18 02:32:31