MVC模式 與 三層架構

MVC與三層架構解釋整理。

MVC模式(Model–view–controller)

是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:

  • 模型(Model): 用於封裝與應用程式的業務邏輯相關的資料以及對資料的處理方法。「 Model 」有對資料直接存取的權力,例如對資料庫的存取。
    • 「Model」不依賴「View」和「Controller」,也就是說, Model 不關心它會被如何顯示或是如何被操作。
    • 但是 Model 中資料的變化一般會通過一種重新整理機制被公布。為了實現這種機制,那些用於監視此 Model 的 View 必須事先在此 Model 上註冊,從而,View 可以了解在資料 Model 上發生的改變。(比如:觀察者模式(軟體設計模式))
  • 視圖(View):能夠實現資料有目的的顯示(理論上,這不是必需的)。在 View 中一般沒有程式上的邏輯。為了實現 View 上的重新整理功能,View 需要存取它監視的資料模型(Model),因此應該事先在被它監視的資料那裡註冊。
  • 控制器(Controller): 起到不同層面間的組織作用,用於控制應用程式的流程。它處理事件並作出回應。「事件」包括使用者的行為和資料 Model 上的改變。

MVC模式在概念上強調 Model, View, Controller 的分離,各個模組也遵循著由 Controller 來處理訊息,Model 掌管資料來源,View 負責資料顯示的職責分離原則,因此在實作上,MVC 模式的 Framework 通常會將 MVC 三個部份分離實作:

  • Model 負責資料存取,較現代的 Framework 都會建議使用獨立的資料物件 (DTO, POCO, POJO 等) 來替代弱型別的集合物件。資料存取的程式碼會使用 Data Access 的程式碼或是 ORM-based Framework,也可以進一步使用 Repository Pattern 與 Unit of Works Pattern 來切割資料來源的相依性。
  • Controller 負責處理訊息,較高階的 Framework 會有一個預設的實作來作為 Controller 的基礎,例如 Spring 的 DispatcherServlet 或是 ASP.NET MVC 的 Controller 等,在職責分離原則的基礎上,每個 Controller 負責的部份不同,因此會將各個 Controller 切割成不同的檔案以利維護。
  • View 負責顯示資料,這個部份多為前端應用,而 Controller 會有一個機制將處理的結果 (可能是 Model, 集合或是狀態等) 交給 View,然後由 View 來決定怎麼顯示。例如 Spring Framework 使用 JSP 或相應技術,ASP.NET MVC 則使用 Razor 處理資料的顯示。

三層架構(3-tier architecture)

是一種軟體抽象的層次結構,從”整個應用程式架構的角度”來區分為三層。

目的: 高內聚,低耦合的思想
優點:

  • 利於標準化
  • 降低層與層之間的依賴
  • 利於各層邏輯的復用,資源重用性好
  • 開發人員可以只關注整個結構中的其中某一層
  • 具有良好的開放性和可擴充性,維護和升級方便
  • 提高系統的安全性

缺點:

  • 有時會導致連動的修改。
  • 如果在表現層中需要增加一個功能,為保證其設計符合分層式結構,可能需要在相應的商業邏輯層和資料存取層中都增加相應的程式碼。
  • 相對於不分層,降低了系統的性能。
  • 如果不採用分層式結構,很多業務可以直接造訪資料庫,以此獲取相應的數據,如今卻必須通過中間層來完成。
  • 增加了開發成本。

分層:

  • 表現層(Presentation layer):通俗講就是展現給使用者的介面,即使用者在使用一個系統的時候他的所見所得。
  • 業務邏輯層(Business Logic Layer):針對具體問題的操作,也可以說是對資料層的操作,對資料業務邏輯處理。
  • 資料訪問層(Data Access Layer):該層所做事務直接運算元據庫,針對資料的增添、移除、修改、查找等。

3-tier architecture

3-tier architecture-en

兩者的差異

  • 三層架構是一個分層式的軟件體系架構設計。 MVC是一個設計模式,它是根據項目的具體需求來決定是否適用於該項目。
  • 三層架構的目的著重點是”高內聚,低耦合”,即解耦。 MVC的目的則是實現Web系統的職能分工,即職責劃分。
  • 三層側重的是整體的一個解耦。 MVC側重的是web系統的解耦,即側重jsp和Servlet的一個解耦。
  • 三層架構的分層模式是典型的上下關系,上層依賴於下層。 MVC作為表現模式是不存在上下關系的,而是相互協作關系。

more info:MVC Wiki
more info:三層結構與 Asp.Net MVC 的簡介 Wiki
more info:三層架構與MVC的區別
more info:三層架構與MVC的區別
more info:[softwareengineering討論區]https://softwareengineering.stackexchange.com/questions/299836/difference-between-3-tier-architecture-and-mvc-model-view-controller-in-asp-n