對(duì)于大部分面向最終用戶的應(yīng)用來(lái)說(shuō),它們都需要具有一個(gè)可視化的UI界面與用戶進(jìn)行交互,我們將這個(gè)UI稱為視圖(View)。在早期,我們傾向于將所有與UI相關(guān)的操作糅合在一起,這些操作包括UI界面的呈現(xiàn)、用于交互操作的捕捉與響應(yīng)、業(yè)務(wù)流程的執(zhí)行以及對(duì)數(shù)據(jù)的存取,我們將這種設(shè)計(jì)模式稱為自治視圖(Autonomous View,AV)。
創(chuàng)新互聯(lián)是一家專業(yè)提供霸州企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為霸州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
說(shuō)到自治視圖,很多人會(huì)感到陌生,但是我們(尤其是.NET開(kāi)發(fā)人員)可能經(jīng)常在采用這種模式來(lái)設(shè)計(jì)我們的應(yīng)用。Windows Forms和ASP.NET Web Forms雖然分別屬于GUI和Web開(kāi)發(fā)框架,但是它們都采用了事件驅(qū)動(dòng)的開(kāi)發(fā)方式,所有與UI相關(guān)的邏輯都可以定義在針對(duì)視圖(Windows Forms或者Web Forms)的后臺(tái)代碼(Code Behind)中,并最終注冊(cè)到視圖本身或者視圖元素(控件)的相應(yīng)事件上。
一個(gè)典型的人機(jī)交互應(yīng)用具有三個(gè)主要的關(guān)注點(diǎn),即數(shù)據(jù)在可視化界面上的呈現(xiàn)、UI處理邏輯(用于處理用戶交互式操作的邏輯)和業(yè)務(wù)邏輯。自治視圖模式將三者混合在一起,勢(shì)必會(huì)帶來(lái)如下一些問(wèn)題:
業(yè)務(wù)邏輯是與UI無(wú)關(guān)的,應(yīng)該最大限度地被重用。由于業(yè)務(wù)邏輯定義在自治視圖中,相當(dāng)于完全與視圖本身綁定在一起,如果我們能夠?qū)I的行為抽象出來(lái),基于抽象化UI的處理邏輯也是可以被共享的。但是定義在自治視圖中的UI處理邏輯完全喪失了重用的可能。
業(yè)務(wù)邏輯具有最強(qiáng)的穩(wěn)定性,UI處理邏輯次之,而可視化界面上的呈現(xiàn)最差(比如我們經(jīng)常會(huì)為了更好地呈現(xiàn)效果來(lái)調(diào)整HTML)。如果將具有不同穩(wěn)定性的元素融為一體,那么具有最差穩(wěn)定性的元素決定了整體的穩(wěn)定性,這是“短板理論”在軟件設(shè)計(jì)中的體現(xiàn)。
任何涉及UI的組件都不易測(cè)試。UI是呈現(xiàn)給人看的,并且用于與人進(jìn)行交互,用機(jī)器來(lái)模擬活生生的人來(lái)對(duì)組件實(shí)施自動(dòng)化測(cè)試不是一件容易的事,自治視圖嚴(yán)重?fù)p害了組件的可測(cè)試性。
為了解決自治視圖導(dǎo)致的這些問(wèn)題,我們需要采用關(guān)注點(diǎn)分離(Seperation of Concerns,SoC)的方針將可視化界面呈現(xiàn)、UI處理邏輯和業(yè)務(wù)邏輯三者分離出來(lái),并且采用合理的交互方式將它們之間的依賴降到最低。將三者“分而治之”,自然也使UI邏輯和業(yè)務(wù)邏輯變得更容易測(cè)試,測(cè)試驅(qū)動(dòng)設(shè)計(jì)與開(kāi)發(fā)變成了可能。這里用于進(jìn)行關(guān)注點(diǎn)分離的模式就是MVC。
MVC的創(chuàng)建者是Trygve M. H. Reenskau,他是挪威的計(jì)算機(jī)專家,同時(shí)也是奧斯陸大學(xué)的名譽(yù)教授。MVC是他在1979年訪問(wèn)施樂(lè)帕克研究中心(Xerox Palo Alto Research Center,Xerox PARC)期間提出一種主要針對(duì)GUI應(yīng)用的軟件架構(gòu)模式。MVC最初用于SmallTalk,Trygve最初對(duì)MVC的描述記錄在Applications Programming in Smalltalk-80(TM):How to use Model-View-Controller (MVC)這篇論文中,有興趣的讀者可以通過(guò)地址http://st-www.cs.illinois.edu/ users/smarch/st-docs/mvc.html閱讀這篇論文。
MVC體現(xiàn)了關(guān)注點(diǎn)分離這一基本的設(shè)計(jì)方針,它將構(gòu)成一個(gè)人機(jī)交互應(yīng)用涉及的功能分為Model、Controller和View三部分,它們各自具有相應(yīng)的職責(zé)。
Model是對(duì)應(yīng)用狀態(tài)和業(yè)務(wù)功能的封裝,我們可以將它理解為同時(shí)包含數(shù)據(jù)和行為的領(lǐng)域模型(Domain Model)。Model接受Controller的請(qǐng)求并完成相應(yīng)的業(yè)務(wù)處理,在狀態(tài)改變的時(shí)候向View發(fā)出相應(yīng)的通知。
View實(shí)現(xiàn)可視化界面的呈現(xiàn)并捕捉最終用戶的交互操作(比如鼠標(biāo)和鍵盤(pán)操作)。
View捕獲到用戶交互操作后會(huì)直接轉(zhuǎn)發(fā)給Controller,后者完成相應(yīng)的UI邏輯。如果需要涉及業(yè)務(wù)功能的調(diào)用,Controller會(huì)直接調(diào)用Model。在完成UI處理之后,Controller會(huì)根據(jù)需要控制原View或者創(chuàng)建新的View對(duì)用戶交互操作予以響應(yīng)。
圖1-1揭示了MVC模式下Model、View和Controller之間的交互。對(duì)于傳統(tǒng)的MVC模式,很多人認(rèn)為Controller僅僅是View和Model之間的中介,實(shí)則不然,View和Model存在直接的聯(lián)系。View可以直接調(diào)用Model查詢其狀態(tài)信息。當(dāng)Model狀態(tài)發(fā)生改變的時(shí)候,它也可以直接通知View。比如在一個(gè)提供股票實(shí)時(shí)價(jià)位的應(yīng)用中,維護(hù)股價(jià)信息的Model在股價(jià)變化的情況下可以直接通知相關(guān)的View改變其顯示信息。
圖1-1 Model-View-Controller之間的交互
從消息交換模式的角度來(lái)講,Model針對(duì)View的狀態(tài)通知和View針對(duì)Controller的用戶交互通知都是單向的,我們推薦采用事件機(jī)制來(lái)實(shí)現(xiàn)這兩種類型的通知。從設(shè)計(jì)模式的角度來(lái)講就是采用觀察者(Observer)模式通過(guò)注冊(cè)/訂閱的方式來(lái)實(shí)現(xiàn)它們,即View作為Model的觀察者通過(guò)注冊(cè)相應(yīng)的事件來(lái)檢測(cè)狀態(tài)的改變,而Controller作為View的觀察者通過(guò)注冊(cè)相應(yīng)的事件來(lái)處理用戶的交互操作。
我看到很多人將MVC和所謂的“三層架構(gòu)”進(jìn)行比較,其實(shí)兩者并沒(méi)有什么可比性,MVC更不是分別對(duì)應(yīng)著UI、業(yè)務(wù)邏輯和數(shù)據(jù)存取三個(gè)層次,不過(guò)兩者也不能說(shuō)完全沒(méi)有關(guān)系。Trygve M. H. Reenskau當(dāng)時(shí)提出MVC的時(shí)候是將其作為構(gòu)建整個(gè)GUI應(yīng)用的架構(gòu)模式,這種情況下的Model實(shí)際上維護(hù)著整個(gè)應(yīng)用的狀態(tài)并實(shí)現(xiàn)了所有的業(yè)務(wù)邏輯,所以它更多地體現(xiàn)為一個(gè)領(lǐng)域模型。而對(duì)于多層架構(gòu)來(lái)說(shuō)(比如我們經(jīng)常提及的三層架構(gòu)),MVC是被當(dāng)成UI呈現(xiàn)層(Presentation Layer)的設(shè)計(jì)模式,而Model則更多地體現(xiàn)為訪問(wèn)業(yè)務(wù)層的入口(Gateway)。如果采用面向服務(wù)的設(shè)計(jì),業(yè)務(wù)功能被定義成相應(yīng)服務(wù)并通過(guò)接口(契約)的形式暴露出來(lái),這里的Model還可以表示成進(jìn)行服務(wù)調(diào)用的代理。
本文節(jié)選自《ASP.NET MVC 4框架揭秘》
蔣金楠著
電子工業(yè)出版社出版
文章題目:傳統(tǒng)MVC模式
鏈接地址:http://www.chinadenli.net/article2/joigic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、全網(wǎng)營(yíng)銷推廣、網(wǎng)站制作、微信小程序、企業(yè)建站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)