MVC (Model-View-Controller)

大名鼎鼎的 MVC(Model-View-Controller)是一種 compound pattern,要說是個架構也行,這篇主要用 design pattern 的角度去看 MVC。

compound pattern 是一堆 design pattern 被結合起來使用以解決一般性問題。

MVC 將 component 分成 model、view 以及 controller:

  • model 包含商業邏輯、資料、狀態等等,真正的功能跟做事的 code 會放在 model。
  • view 負責呈現各種資料跟畫面。
  • controller 接收來自 view 的 input,解讀後要 model 做事。依據使用的 model 不同,controller 對 input 的解讀會不同。

MVC 中的 design pattern

MVC 中有 Observer patternStrategy pattern 以及 Composite pattern

model 利用 observer pattern 通知 controller 及 view 狀態改變。如果 observer 使用 pull 的方式取得資料,model 會開 getter。如果用 push,model 會在 notify 時將 state 傳給 observer。view 一般只從 model 取得資料、不會改變 model。要 model 做事或改變 model 是 controller 的工作。有 controller 可以讓 model 跟 view 不要綁那麼緊。

view 跟 controller 使用 strategy pattern,controller 是 view 的 strategy。view 負責管理呈現,任何操作與動作都交給 controller 處理。strategy 讓 view 只需要更換 controller 就能有不同動作。

view 通常用 composite pattern 管理內部的顯示 component,例如 window、panel、widget、button 的階層式結構。

另外,如果需要轉換某個 model 的 interface 就輪到 Adapter pattern 上場啦。例如 db table 的 primary key 改了,新程式碼希望用新的 primary key 當參數又不想改舊 model,就可以用 adapter 轉換 interface。

Murmur

最早遇到 MVC 是在網頁 framework,所以一直理解 model 為「資料」。後來發現 model 好像不只是資料,有文件說 model 包含商業邏輯,但我還是說不上來到底是什麼。現在的理解是絕大多數的程式都是 model,只是把 view 拆出去並且引進 controller 作為類似中介的角色。