轉(zhuǎn)自:http://www.ruanyifeng.com/blog/2007/11/mvc.html
1.
如何設(shè)計(jì)一個(gè)程序的結(jié)構(gòu),這是一門專門的學(xué)問,叫做"架構(gòu)模式"(architectural pattern),屬于編程的方法論。
MVC模式就是架構(gòu)模式的一種,它對(duì)我的啟發(fā)特別大。我覺得它不僅適用于開發(fā)軟件,也適用于其他廣泛的設(shè)計(jì)和組織工作。
下面是我對(duì)MVC模式的一些個(gè)人理解,不一定正確,主要用來整理思路。
2.
MVC是三個(gè)單詞的首字母縮寫,它們是Model(模型)、View(視圖)和Controller(控制)。
這個(gè)模式認(rèn)為,程序不論簡(jiǎn)單或復(fù)雜,從結(jié)構(gòu)上看,都可以分成三層。
1)最上面的一層,是直接面向最終用戶的"視圖層"(View)。它是提供給用戶的操作界面,是程序的外殼。
2)最底下的一層,是核心的"數(shù)據(jù)層"(Model),也就是程序需要操作的數(shù)據(jù)或信息。
3)中間的一層,就是"控制層"(Controller),它負(fù)責(zé)根據(jù)用戶從"視圖層"輸入的指令,選取"數(shù)據(jù)層"中的數(shù)據(jù),然后對(duì)其進(jìn)行相應(yīng)的操作,產(chǎn)生最終結(jié)果。
這三層是緊密聯(lián)系在一起的,但又是互相獨(dú)立的,每一層內(nèi)部的變化不影響其他層。每一層都對(duì)外提供接口(Interface),供上面一層調(diào)用。這樣一來,軟件就可以實(shí)現(xiàn)模塊化,修改外觀或者變更數(shù)據(jù)都不用修改其他層,大大方便了維護(hù)和升級(jí)。
3.

我用Windows的計(jì)算器小程序?yàn)槔?,解釋一下MVC模式,雖然它不一定使用這個(gè)模式編寫。
在這個(gè)計(jì)算器程序中,外部的那些按鈕和最上面的顯示條,就是"視圖層",那些需要運(yùn)算的數(shù)字就是"數(shù)據(jù)層",執(zhí)行加減乘除的那些內(nèi)部運(yùn)算步驟就是"控制層"。每一層執(zhí)行不同的功能,整個(gè)程序的結(jié)構(gòu)非常清楚。
如果我們擴(kuò)大一點(diǎn)想象,就會(huì)發(fā)現(xiàn),很多程序本質(zhì)上都是這種模式:對(duì)外提供一組觸發(fā)器(本例中是按鈕),然后執(zhí)行一些內(nèi)部操作,最后返回結(jié)果。因此,MVC模式的應(yīng)用是非常廣泛的。
4.

在我看來,不僅編寫程序可以用MVC模式,家用電器也可以用。
以家用微波爐為例,可以將它也理解成三層結(jié)構(gòu)。最簡(jiǎn)單的情況下,微波爐的操作用兩個(gè)轉(zhuǎn)盤實(shí)現(xiàn),一個(gè)控制溫度,另一個(gè)控制時(shí)間。這兩個(gè)轉(zhuǎn)盤就是"視圖層"(view),而其內(nèi)部的微波產(chǎn)生裝置則是"數(shù)據(jù)層"(Model),這里的"數(shù)據(jù)"需要理解成"核心功能"。至于將用戶通過轉(zhuǎn)盤輸入的信息,轉(zhuǎn)換成對(duì)微波產(chǎn)生器的操作,則用"控制層"來實(shí)現(xiàn)。
如果每一層都是獨(dú)立的,那么微波爐外部更換一個(gè)新潮的外殼,或者內(nèi)部更換更大功率的微波產(chǎn)生器,完全可以在不更改其他層的情況下實(shí)現(xiàn)。這就是MVC模式的優(yōu)勢(shì)。
5.
再進(jìn)一步,如果將MVC模式解釋成"外觀"、"機(jī)制"和"功能/數(shù)據(jù)"這三層結(jié)構(gòu),那么很多人類組織也可以通過MVC模式架構(gòu)。
比如一家商場(chǎng),完全可以分成三部分。一部分是倉庫,負(fù)責(zé)提供商品,這是"功能層"(或者"數(shù)據(jù)層");另一部分是零售鋪面,負(fù)責(zé)銷售商品,這是它的"外觀層";兩者之間就是"機(jī)制層",包括柜臺(tái)和倉庫之間一切互動(dòng)的機(jī)制。
這樣區(qū)分以后,這個(gè)商場(chǎng)的結(jié)構(gòu)就變得非常清楚,可以針對(duì)不同的層進(jìn)行優(yōu)化,提高效率。
6.
公司、政黨、政府、醫(yī)院、學(xué)校等等,這些組織不管是盈利性還是非盈利性的,都可以從MVC模式的角度,進(jìn)行架構(gòu),由一個(gè)個(gè)執(zhí)行特定功能、可重復(fù)使用的模塊組成。
我在想,如果人類社會(huì)都是模塊化結(jié)構(gòu),那會(huì)是怎樣的情景?