有朋友談到三層與MVC的區別以前也有人拋出這個問題本人對來公司面試的朋友也偶樂會提這方面的問題
那麼我也來講講我對這兩者的理解吧
首先對這個題目本身是存在問題的XX結構與XX模式的區別?請問中國社會制度與美國人生活方式有什麼區別?
這兩者本身講的是不同方向與角度的問題在實際應用中他們的確存在一些相似的特點在很多書籍中也沒有深入講解以致於造成困惑為了更好的理解他們姑且來說說區別吧
首先N層結構是一種軟件抽象的層次結構是對復雜軟件的一種縱向切分每一層次中完成同一類型的操作以便將各種代碼以其完成的使命作為依據來分割以將低軟件的復雜度提高其可維護性一般來說層次之間是向下依賴的下層代碼未確定其接口(契約)前上層代碼是無法開發的下層代碼接口(契約)的變化將使上層的代碼一起變化三層結構是N層結構的一種是人產在長時間使用中得出來的一種應用場合廣泛的N層結構被當作一種典型的軟件層次結構而廣為流傳甚至寫入教科書
MVC模式是一種復合設計模式一種在特定場合用於解決某種實際問題來得出的可以反復實踐的解決方案巧合的是他也有三個事物組成於是乎人們就有了一種想當然的對應關系展示層View業務邏輯層Control持久層Model首先MVC中的三個事物之間並不存在明顯的層次結構沒有明顯的向下依賴關系相反的View和Model往往是比較獨立的而Control是連接兩者的橋梁他們更像是橫向的切分這樣一來就出現一個結果MVC中每個塊都是可以獨立測試的而三層結構中上層模塊的運行測試勢必要提供下層代碼或者提供相同接口的樁相對來說MVC復雜得多但是結構更清晰耦合性更低
另外MVC中每一塊內部特別是Model內部經常被設計為多層的在我認為的一個良好的MVC模式構建的結構中Control是核心小且較為穩定的可以作為一個核心框架來提供有擴展點但基本上可以簡單配置不需要任何代碼就可以運行而View則可能是一套或多種可選擇的視圖引擎決定了軟件展示給用於的界面使用時的主要工作量在於擴展點以及根據需要而數量不同的視圖模板Model則是業務提供者決定了軟件提供的功能其內部可能是一些普通的類或者是實現了某些接口的類在這一塊當中可能根據業務的不同而色彩缤紛對於復雜的軟件可能會分成很多層如業務邏輯層業務提供層系統提供層數據提供層數據訪問層等
我經常用於比喻MVC的例子是小時候玩的那種卡帶式游戲機Control是主機一般來說我買一個主機就行了只要他不壞他就能一直讓我玩這一類的游戲View則是電視機和游戲手柄電視機可以獨立工作他不管輸入的是電視信號影碟機信號還是游戲機信號他只管顯示而且他決定了我們看到的效果是怎麼樣的如果我想要個尺寸更大的或者彩色的顯示效果我只需要買個相應的電視機就行了手柄也是可以換的要遙桿還是帶震動的Model則是游戲卡帶他絕定了我玩的是什麼游戲是魂斗羅還是超級瑪莉而且游戲機主機和電視機生產廠家永遠也不知道在上面有可能會運行什麼樣的游戲卡帶中可能會有游戲代碼和存儲單元都根據游戲的需要而設計
有朋友提到游戲主機提供的卡帶插槽的接口在設計中有時也由Control提供一組接口以用於Model或View的實現這樣就形成了依賴一般來說這樣設計也沒有太大的問題只是會提高模塊間的耦合度也會帶來一些侵入性為了更完美可以不用接口來提供契約可以用配置信息(或稱元數據信息)+反射來提供契約那麼這個類接口就可以退化到只要符合CLS就可以了也就是普通的類就像現在的計算機接口廣泛采用USB無論是U盤打印機掃描儀或者是加密狗他們都是普通的USB設備而已
提到USB有一個題外話模塊的可插拔性設計甚至是熱插拔設計系統可以在不停止運行的情況下動態的掛載或移除模塊動態掛載模塊需要系統能夠自動發現新模塊並根據自描述的信息進行自動配置移除可能情況更復雜一點需要安全刪除硬件類似的功能
在設計廣泛重用的框架時會考慮多種情況以達到更大的適應性一般項目中應用MVC模式可以較為隨意
From:http://tw.wingwit.com/Article/program/net/201311/15628.html