談談你對MVC的理解


MVC 模式

MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用於應用程序的分層開發。

  • Model(模型) - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯在數據變化時更新控制器
  • View(視圖) - 視圖代表模型包含的數據的可視化
  • Controller(控制器) - 控制器作用於模型和視圖上。它控制數據流向模型對象,並在數據變化時更新視圖。它使視圖與模型分離開。

    Controller層用來調度View層和Model層,將用戶界面和業務邏輯合理的組織在一起,起粘合劑的效果。所以Controller中的內容能少則少,這樣才能提供最大的靈活性。controller相當於路由的作用。

 

實現

我們將創建一個作為模型的 Student 對象。StudentView 是一個把學生詳細信息輸出到控制台的視圖類,StudentController 是負責存儲數據到 Student 對象中的控制器類,並相應地更新視圖 StudentView

MVCPatternDemo,我們的演示類使用 StudentController 來演示 MVC 模式的用法。

MVC 模式的 UML 圖

 

MVC 是軟件工程里面一個常用的概念。通常來講, C 主要是指請求 url 的路由規則,即把請求打到對應的控制器。控制器調用模型實現業務邏輯和底層數據的獲取,這一步驟一般在代碼里會抽象出多個層次,比如 service,model,handler,controller 等等,看開發者的個人喜好,統稱為 Model 層。最后交給渲染器渲染成 html 這樣的客戶端直接可用的格式,返回給客戶端,這一步驟一般叫視圖層。不過 MVC 在 web 開發里面已經有點昨日黃花的意味。 現在講究服務化,REST等等,前后端進一步分離,出現專門寫邏輯的前端和 MVVM 模式, View 層在后端可以說已經用不到了當然你也可以把生成的 json 理解成 View 層。MVC 模式里面容易讓人誤解的就是 Model 層, 其實 model 層不僅包含了從數據庫獲取數據,還包含了與請求相關的各種業務邏輯,可以說 model 層包含了你 90% 以上的代碼。

在代碼中,前后端分離項目,大多就是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM