MVC分層設計
什么是MVC?
MVC 是一種軟件架構模式,利用分層的思想來設計交互式應用程序,由以下3層組成:
Model
業務模型層。View
展示層。Controller
控制層。
MVC包含完整可供用戶使用的程序。對於Web程序而言,MVC包含網頁、后台處理程序、數據庫等。
Model
可以理解為一個函數,有輸入和輸出,比如訓練好的決策樹算法。給模型輸入一個數據,它可以計算得到對應的結果,它是業務的載體;在spring
等常見的MVC框架中Model
通常就是service
。
View
用來展示數據。常見的形式有:
- 網頁
- Windows桌面窗口
- 手機APP
交互式應用程序通常還是給人看的,所有要有一種展現形式表達它;通過View
層來獲取用戶的輸入以及展示Model
的計算結果; 在spring
等常見的MVC框架中Model
通常就是jsp/html
等。
Controller
則負責處理交互事件,比如用戶請求。用戶在View
觸發的事件被捕獲后,將事件代表的業務含義提交到對應的模型中處理,然后將模型的處理結果再返回給View層展示; 在spring
等常見的MVC框架中Controller
通常就Spring
中的Controller
, Spring 框架主要提供的就是Controller
層的功能。
如何使用 MVC?
優勢
相對於將代碼全部寫在一起的方式,使用MVC有兩點重要優勢:
- 將復雜問題分解,便於實現。
- 降低程序內部的耦合度,減少重構成本。
分解問題后,更容易局部邏輯變的更加簡單,適合處理復雜度比較高的業務;分層后各層使用接口通訊,只要維護接口不變就可以實現各層的替換。對於View
層如果想增加一種展現形式或者替換只需要修改這一層就可以了,比如對於網頁程序,想增加手機APP,那么只需要開發手機APP,而Model
層則可以復用。對於Controller
而言我們可以輕易將Spring
框架替換成Struts
等,而網頁或者業務不用重寫。
邊界
邊界就是哪層可以做的事情和不可以做的事情。以Spring框架為例,項目結構通常如下:
|-project
|-service
|-controller
|-bean
|-dao
其中MVC中的Model對應service
,bean
,dao
目錄,controller
對應MVC中的controller。
- controller層能做的事情
- 接受http請求校驗請求方法、數據大小等。
- 寫出響應結果
- 根據請求url路由對應的service方法,也就是model
- model層能做的事情
- 業務處理。
- 業務的參數校驗。
以銀行的取錢業務為例,在業務層實現取錢的邏輯,我們可能要定義一個方法:
def withdraw(卡號,密碼,金額):
pass
接着在這個方法體里校驗密碼是否正確、余額是否充足,這些參數的類型可能正確,但是不一定合法,這個區別於controller層的參數校驗,那個是校驗是驗證參數是否符合接口定義,比如定義了一個age必須是int類型,傳了一個字符串就要報錯,接着在controller中定義url、請求的方法、參數的名稱類型如下:
def handle_withdraw(http_req):
content = http_req.content # 獲取http報文體
card_no = content.get("card_no")
passwd = content.get("passwd")
amount = content.get("amount")
# 調用業務方法
withdraw(card_no, passwd, amount)
當我們更換服務的協議時候,業務方法是不必重寫的,我們只需要寫一個新的接受請求事件的控制層,由http更換為mq,新寫一個控制層如下:
def listen(evet):
content = evet.msg # 獲取http報文體
card_no = content.get("card_no")
passwd = content.get("passwd")
amount = content.get("amount")
# 調用業務方法
withdraw(card_no, passwd, amount)
這樣可以當公司規模變化在架構演進過程中復用代碼,降低重構的代價。