MVC 模式
MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用於應用程序的分層開發。
- Model(模型) - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯,在數據變化時更新控制器。
- View(視圖) - 視圖代表模型包含的數據的可視化。
- Controller(控制器) - 控制器作用於模型和視圖上。它控制數據流向模型對象,並在數據變化時更新視圖。它使視圖與模型分離開。
Controller層用來調度View層和Model層,將用戶界面和業務邏輯合理的組織在一起,起粘合劑的效果。所以Controller中的內容能少則少,這樣才能提供最大的靈活性。controller相當於路由的作用。
實現
我們將創建一個作為模型的 Student 對象。StudentView 是一個把學生詳細信息輸出到控制台的視圖類,StudentController 是負責存儲數據到 Student 對象中的控制器類,並相應地更新視圖 StudentView。
MVCPatternDemo,我們的演示類使用 StudentController 來演示 MVC 模式的用法。
在代碼中,前后端分離項目,大多就是controller-service-dao三層架構,三層架構和mvc並不是兩個對立的東西, service層與dao層是對model的進一步解耦而形成的分層,而controller(web)層本來就不該含有業務邏輯
(我以前以為model是數據,controller是邏輯,這是錯的)
很多程序員偏愛於將業務邏輯放在Controller中,我極力反對這種做法。
我們知道在寫程序時,業務邏輯的重復使用是經常要面對的場景。 如果業務邏輯寫在控制器中, 要重用它的唯一方法就是將它提升到父類之中,通過繼承來達到代碼復用的效果。但這么做會帶來一個巨大的副作用,違背了一項重要的面向對象設計原則:接口隔離。(?)
各Model之間是可以相互調用的, Controller也可以無障礙的調用Model,因此將業務邏輯放在Model中可以靈活的使用組合的方式復用代碼。
而Controller之間是不可以相互調用的,要復用代碼只能將代碼提升至父類,通過繼承實現,顯然這種做法既不正確,也不靈活,因此完全不提倡。
為什么23種設計模式里面沒有MVC?
MVC的是為了把數據(Model)和視圖(View)分離開來,然后用控制器(Controller)來粘合M和V之間的關系。
MVC是複合模式,結合了觀察者模式,策略模式和組合模式。--《Head First設計模式》
然我們利用我們學過的模式技術來重新看待一下MVC吧
沒錯,MVC裏面就運用了我們之前學過的策略模式,組合模式和觀察者模式
總結
模型使用觀察者模式,以便觀察者更新,同時保持兩者之間的解耦。
控制器是視圖的策略,視圖可以使用不同的控制器實現,得到不同的行為。
視圖使用組合模式實現用戶界面,用戶界面通常組合了嵌套的組件,像面板、框架和按鈕。
GoF (Gang of Four,四人組, 《Design Patterns: Elements of Reusable Object-Oriented Software》/《設計模式》一書的作者:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)並沒有把MVC提及為一種設計模式,而是把它當做“一組用於構建用戶界面的類集合”。在他們看來,它其實是其它三個經典的設計模式的演變:觀察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和組合模式(Composite)。根據MVC在框架中的實現不同可能還會用到工廠模式(Factory)和裝飾器(Decorator)模式。我在另一本免費的書“JavaScript Design Patterns For Beginners”中講述了這些模式,如果你有興趣可以閱讀更多信息。
正如我們所討論的,models表示應用的數據,而views處理屏幕上展現給用戶的內容。為此,MVC在核心通訊上基於推送/訂閱模型(驚訝的是 在很多關於MVC的文章中並沒有提及到)。當一個model變化時它對應用其它模塊發出更新通知(“publishes”),訂閱者 (subscriber)——通常是一個Controller,然后更新對應的view。觀察者——這種自然的觀察關系促進了多個view關聯到同一個 model。
對於感興趣的開發人員想更多的了解解耦性的MVC(根據不同的實現),這種模式的目標之一就是在一個主題和它的觀察者之間建立一對多的關系。當這個 主題改變的時候,它的觀察者也會得到更新。Views和controllers的關系稍微有點不同。Controllers幫助views對不同用戶的輸 入做不同的響應,是一個非常好的策略模式列子。
嗯嗯,知道為什么MVC沒有被GOF當作【一種】模式來對待了吧?
View層,單獨實現了組合模式
Model層和View層,實現了觀察者模式
View層和Controller層,實現了策咯模式
鏈接:
https://www.smwenku.com/a/5b8e80592b7177188345a942/
https://zhuanlan.zhihu.com/p/35680070
https://www.zhihu.com/question/27897315/answer/491119336
http://www.runoob.com/design-pattern/mvc-pattern.html