聊一聊耳熟能詳的MVC設計模式與三層架構

說起MVC,感覺大家都能嘮個兩塊錢的。今天呢,我們也來簡單的聊一聊,並以Java Web開發爲例,簡單的講解項目應當如何分層。

1.MVC之前

在Web開發早期,當Sun公司推出了JSP技術後,在當時是極大的震撼了整個行業,包括微軟後面推出的ASP也是針對JSP推出的反制手段。在早期使用JSP開發的Web應用中,JSP因爲其強大的特性,以Java語言寫的代碼塊作爲腳本,因此一個JSP文件是一個獨立的、能自主完成所有任務的模塊(其他的動態網站技術比如ASP、PHP也是如此),它可以負責處理業務邏輯、控制頁面跳轉和向用戶展示頁面等。

資源分配圖

在上圖這個模式中,"全棧"開發似乎變得簡單了許多,只需要在JSP中開發就可以了。但這麼做的一個明顯的弊端,就是JSP頁面中的功能過於繁雜、耦合性太高,數據、業務邏輯、流程控制全都混雜在一起,使得程序後續難以維護和修改。

​爲了解決上述問題,SUN公司提供了一種JSP開發的架構模型,我們可以稱之爲JSP Model1。在這個模型中,採用JSP+JavaBean(將萬物抽象成對象,提供一些屬性和對應的getter、setter方法)技術,將頁面的顯示和業務邏輯分開。

資源分配圖

​從上圖中,我們可以看到,JSP Model1將封裝數據和處理數據的業務邏輯交給了JavaBean組件,JSP只負責接收用戶的請求和調用JavaBean組件來響應用戶的請求。這種設計在一定程度上實現了數據、業務邏輯、頁面展示的分離,在一定程度上實現了程序開發的模塊化(分層),降低了程序間的耦合性,讓代碼的維護、修改成本有效的降低。

2.MVC設計模式

MVC設計是由[Xerox PARC](https://baike.baidu.com/item/Xerox PARC)(施樂帕克,研究中心)在20世紀80年代爲編程語言Smalltalk-80發明的一種軟件設計模式,提供了一種按照功能模塊劃分的指導思想。

​MVC設計模式將應用程序分爲三個核心模塊:模型(Model)、視圖(View)、控制器(Controller)。每個模塊的作用如下所示:

  • 模型(Model):負責管理應用程序的業務數據、定義訪問控制以及修改這些數據的方法。
  • 視圖(View):負責與用戶進行交互,它從模型中獲取數據向用戶展示,同時也能將用戶請求傳遞給控制器處理。
  • 控制器(Controller):負責應用程序中處理用戶交互的部分,可以從視圖中取數據,控制用戶輸入,並向模型發送數據。
資源分配圖

​MVC模式廣泛的應用的於Web開發中,我們以Java Web開發來簡單說明應用程序應該怎麼樣劃分模塊:Controller層爲Servlet,View層爲JSP,Model層爲JavaBean。圖中的步驟1、2、3、4是用戶進行請求時的處理流程。

資源分配圖

3.三層架構

​三層架構(3-tier architecture)通常是將整個業務應用劃分爲:表示層(User show layer, USL)、業務邏輯層(Business Logic Layer, BLL)、數據訪問層(Data access layer, DAL)。其中每層的作用如下:

  • 表示層:又稱表現層UI,位於三層構架的最上層,與用戶直接接觸,主要是用戶瀏覽的頁面,其主要功能是實現系統數據的傳入與輸出,在此過程中不需要藉助邏輯判斷操作就可以將數據傳送到BLL系統中進行數據處理,處理後會將處理結果反饋到表示層中;
  • 業務邏輯層:中間層,對具體問題進行邏輯判斷與執行操作,當接收到表現層UI的用戶指令後,會連接數據訪問層,將數據庫訪問層的增刪改查進行組裝,並將處理結果返回給表示層;
  • 數據庫訪問層:主要用於操作數據庫中的數據,實現數據的增刪改查操作,並將處理結果返回給業務邏輯層。

​三層架構相比較於MVC是更宏觀的解決方案,MVC相當於對三層架構中的表示層。不管這兩個的哪一種,都是對應用程序進行分層,其目的就是實現高內聚、低耦合的目標,將程序分成不同的模塊,讓開發和維護變得更清晰明瞭。

4.項目分層

​這裏給大家推薦《阿里巴巴Java開發手冊》中工程結構里約定的應用分層。

資源分配圖

​ 圖中默認上層依賴於下層,箭頭關係表示可直接依賴,如:開放接口層可以依賴於Web 層,也可以直接依賴於 Service 層,依此類推。每個層的定義我們簡單看下:

  • 終端顯示層:各個端的模板渲染並執行顯示的層。當前主要是 velocity 渲染,JS 渲染,JSP 渲染,移動端展示等;

  • 開放接口層:可直接封裝 Service 方法暴露成 RPC 接口;通過 Web 封裝成 http 接口;進行網關安全控制、流量控制等;

  • Web層:主要是對訪問控制進行轉發,各類基本參數校驗,或者不復用的業務簡單處理等;

  • Service層:相對具體的業務邏輯服務層;

  • Manager層:通用業務處理層;

    1) 對第三方平臺封裝的層,預處理返回結果及轉化異常信息;

    2) 對 Service 層通用能力的下沉,如緩存方案、中間件通用處理;

    3) 與 DAO 層交互,對多個 DAO 的組合複用;

  • DAO層:數據訪問層,與底層 MySQL、Oracle、Hbase 等進行數據交互。

  • 外部接口或第三方平臺:包括其它部門 RPC 開放接口,基礎平臺,其它公司的 HTTP 接口。

​在我們的實際項目中,一般是不需要設置web層和manager層的,除非業務特別複雜。因此推薦項目分層如下:

資源分配圖

5.總結

​其實許多同學可能會有些疑惑,由於ajax的出現許多項目現在開始實行前後端分離的做法,尤其是現在優秀的前端框架層出不窮,比如Vue、React、AngularJS等,似乎三層架構和我們上面的推薦的分層就不適用了。其實不是這樣的,我們將頁面劃分爲終端顯示層,無論項目是否是前後端分離,我們都可以將我們的Java代碼劃分爲Controller+services+dao+util+model。

​文章到這也就結束了,希望本文對你有所幫助,也希望我們的項目都可以結構清晰,可以使用分層的方式降低代碼之間的耦合性,讓代碼更容易被維護和修改。

參考閱讀:

  1. MVC框架
  2. 三層架構
  3. 看完這篇,別人的開源項目結構應該能看懂了
  4. 阿里巴巴Java開發手冊

​又到了分隔線以下,本文到此就結束了,本文內容全部都是由博主自己進行整理並結合自身的理解進行總結,如果有什麼錯誤,還請批評指正。

​Java web這一專欄會是一個系列博客,喜歡的話可以持續關注,如果本文對你有所幫助,還請還請點贊、評論加關注。

​有任何疑問,可以評論區留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章