chp7-軟件架構(gòu)技術(shù)-3-MVC_第1頁(yè)
chp7-軟件架構(gòu)技術(shù)-3-MVC_第2頁(yè)
chp7-軟件架構(gòu)技術(shù)-3-MVC_第3頁(yè)
chp7-軟件架構(gòu)技術(shù)-3-MVC_第4頁(yè)
chp7-軟件架構(gòu)技術(shù)-3-MVC_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

交互式系統(tǒng)體系結(jié)構(gòu)

MVC架構(gòu)模式1交互式系統(tǒng)系統(tǒng)與用戶交互主要通過(guò)GUI目的:增強(qiáng)可用性,適應(yīng)用戶業(yè)務(wù)需求關(guān)鍵:保持功能內(nèi)核獨(dú)立于用戶接口兩種模式MVC-Model-View-Controller將一個(gè)交互式應(yīng)用分為三個(gè)組件PAC-Presentation-Abstraction-Control以合作Agent的層次形式定義交互式系統(tǒng)的一種結(jié)構(gòu)2/MVC體系結(jié)構(gòu)MVC根本概念及應(yīng)用領(lǐng)域MVC主體結(jié)構(gòu)MVC動(dòng)態(tài)特征MVC實(shí)現(xiàn)一個(gè)例子3/MVC根本概念MVC將一個(gè)交互式應(yīng)用程序分成3個(gè)組件模型:包含核心功能和數(shù)據(jù)〔核心業(yè)務(wù)邏輯〕視圖:向用戶顯示信息控制器:處理用戶輸入變更-傳播機(jī)制保證了模型和用戶界面之間的一致性4/100目的將人機(jī)交互從核心功能中別離出來(lái)(M)模型對(duì)用戶來(lái)說(shuō)是透明的,用戶只需要觀察視圖(V)用戶與模型的交互通過(guò)控制器提供的平安方法來(lái)實(shí)現(xiàn)(C)這種別離對(duì)設(shè)計(jì)開(kāi)發(fā)人員是強(qiáng)制性的?。VC根本概念5/100MVC應(yīng)用領(lǐng)域具有靈活人-機(jī)界面的交互式應(yīng)用程序可以靈活選擇不同的信息顯示方式可以靈活選擇用戶的輸入方式針對(duì)不同的用戶角色,提供不同的用戶界面不同用戶具有不同權(quán)限,操作的方式也有所不同6/100MVC體系結(jié)構(gòu)MVC根本概念及應(yīng)用領(lǐng)域MVC主體結(jié)構(gòu)MVC動(dòng)態(tài)特征MVC實(shí)現(xiàn)一個(gè)例子7/模型〔Model〕封裝了內(nèi)核功能和數(shù)據(jù)業(yè)務(wù)邏輯〔軟件的核心〕數(shù)據(jù)以及訪問(wèn)它們的函數(shù)〔視圖組件使用〕執(zhí)行特定應(yīng)用程序處理的過(guò)程〔控制器代表用戶調(diào)用〕模型對(duì)于用戶來(lái)說(shuō)是不可見(jiàn)的(M與V獨(dú)立)模型獨(dú)立于特定輸出表示或者輸入方式(M與C獨(dú)立)用戶只能通過(guò)控制器操作模型(C是M與V之間橋梁)8/變更-傳播機(jī)制(1)一個(gè)模型可對(duì)應(yīng)多個(gè)視圖如果用戶通過(guò)一個(gè)視圖的控制器改變了模型中的數(shù)據(jù),那么依賴于該數(shù)據(jù)的其他視圖也應(yīng)該反映出這樣的變化一旦模型的數(shù)據(jù)發(fā)生了變化,模型需要通知所有相關(guān)的視圖做出相應(yīng)的變化維護(hù)數(shù)據(jù)的一致性9/變更-傳播機(jī)制(2)工作原理:模型維護(hù)了一個(gè)表所有視圖還有一些控制器在這個(gè)表中登記了對(duì)變更通知的需求模型狀態(tài)的改變將觸發(fā)變更-傳播機(jī)制,每個(gè)在表中登記的視圖和控制器都會(huì)收到變更通知可通過(guò)觀察者〔Observer〕設(shè)計(jì)模式完成10/視圖〔View〕向用戶顯示信息不同的視圖使用不同的方法呈現(xiàn)信息每個(gè)視圖組件都有一個(gè)更新函數(shù),這個(gè)函數(shù)被模型變更通知激活函數(shù)被激活〔此時(shí)模型已經(jīng)改變〕后,將使得視圖重新和模型一致在初始化階段,視圖向模型登記請(qǐng)求變更通知〔表〕從模型獲得數(shù)據(jù)通過(guò)狀態(tài)查詢函數(shù)實(shí)現(xiàn)例如:定時(shí)刷新11/控制器〔Controller〕每個(gè)視圖有一個(gè)相關(guān)的控制器組件(一一對(duì)應(yīng))控制器組件接受事件,并翻譯成輸入事件如何發(fā)送到控制器由用戶界面平臺(tái)決定事件被翻譯成為對(duì)模型或者視圖的請(qǐng)求如果控制器的行為依賴于模型的狀態(tài),那么控制器也需要向模型登記請(qǐng)求變更通知例如:用戶點(diǎn)擊按鈕,按鈕的事件響應(yīng)函數(shù)將采取相應(yīng)的措施處理用戶要求用戶僅僅通過(guò)控制器與系統(tǒng)交互12/MVC組件類型的關(guān)系和功能13/注意視圖與控制器是一一對(duì)應(yīng)的關(guān)系模型與視圖是一對(duì)多的關(guān)系變更-傳播機(jī)制保持模型與視圖、控制器之間狀態(tài)的一致性14/MVC體系結(jié)構(gòu)MVC根本概念及應(yīng)用領(lǐng)域MVC主體結(jié)構(gòu)MVC動(dòng)態(tài)特征MVC實(shí)現(xiàn)一個(gè)例子15/動(dòng)態(tài)特征(1):MVC系統(tǒng)的初始化MainprogramModelViewControllermodelviewmodel,viewcontrollerstart16/動(dòng)態(tài)特征(2):MVC系統(tǒng)初始化創(chuàng)立模型實(shí)例,并初始化其數(shù)據(jù)創(chuàng)立視圖對(duì)象,并用對(duì)模型的引用作為初始化參數(shù)之一視圖通過(guò)調(diào)用附屬過(guò)程支持變更-傳遞機(jī)制視圖創(chuàng)立控制器,此時(shí)將模型和視圖的引用作為參數(shù)傳遞給控制器初始化過(guò)程控制器通過(guò)調(diào)用附屬過(guò)程來(lái)支持變更-傳遞機(jī)制初始化完成,應(yīng)用程序開(kāi)始處理事件17/動(dòng)態(tài)特征(3):

輸入導(dǎo)致模型變化,觸發(fā)變更-傳遞機(jī)制18/動(dòng)態(tài)特征(4):

輸入導(dǎo)致模型變化,觸發(fā)變更-傳遞機(jī)制控制器接受到事件,解釋事件并且啟動(dòng)模型的效勞過(guò)程〔handleEvent、service〕模型執(zhí)行相應(yīng)的過(guò)程,并導(dǎo)致內(nèi)部狀態(tài)的變化〔notify〕模型調(diào)用其更新過(guò)程,向所有登記請(qǐng)求了變更-傳播機(jī)制的視圖和控制器發(fā)出通知〔update〕每個(gè)視圖從模型中讀取新數(shù)據(jù)并且重新顯示〔getData〕每個(gè)控制器修改自己的行為,比方禁用某個(gè)功能最初的控制器恢復(fù)控制并從事件處理過(guò)程返回19/MVC體系結(jié)構(gòu)MVC根本概念及應(yīng)用領(lǐng)域MVC主體結(jié)構(gòu)MVC動(dòng)態(tài)特征MVC實(shí)現(xiàn)一個(gè)例子20/MVC實(shí)現(xiàn)(1)設(shè)計(jì)并實(shí)現(xiàn)模型組件封裝內(nèi)核所需要的數(shù)據(jù)和功能確定模型的哪一局部應(yīng)該通過(guò)控制器向用戶顯示,提供訪問(wèn)待顯示數(shù)據(jù)的功能實(shí)現(xiàn)核心業(yè)務(wù)邏輯21/MVC實(shí)現(xiàn)(2)實(shí)現(xiàn)變更-傳播機(jī)制采用觀察者〔Observer〕設(shè)計(jì)模式每個(gè)視圖和需要觀察模型變更的控制器都在模型中注冊(cè)自己的觀察者〔表〕模型中可以隨意添加和刪除觀察者實(shí)現(xiàn)通知各觀察者并改變其狀態(tài)的方法22/MVC實(shí)現(xiàn)(3)設(shè)計(jì)并實(shí)現(xiàn)視圖設(shè)計(jì)視圖的外觀,并實(shí)現(xiàn)畫(huà)圖過(guò)程顯示視圖實(shí)現(xiàn)更新過(guò)程來(lái)反映模型的變化可以簡(jiǎn)單地調(diào)用畫(huà)圖功能,但是不適應(yīng)模型頻繁變化的情況向更新過(guò)程提供一些參數(shù)來(lái)確定是否重畫(huà),以及重畫(huà)范圍可以通過(guò)累積變化的方式減少重畫(huà)的頻率實(shí)現(xiàn)視圖的初始化支持變更-傳遞機(jī)制初始化控制器23/MVC實(shí)現(xiàn)(4)設(shè)計(jì)并實(shí)現(xiàn)控制器對(duì)于每個(gè)視圖,指定回應(yīng)用戶動(dòng)作的系統(tǒng)行為控制器用一個(gè)專用的過(guò)程來(lái)接受并且解釋這些用戶動(dòng)作〔事件〕實(shí)現(xiàn)事件響應(yīng)函數(shù)24/MVC實(shí)現(xiàn)(5)實(shí)現(xiàn)MVC的總體的初始化首先創(chuàng)立并初始化模型實(shí)例創(chuàng)立和初始化視圖實(shí)例同時(shí)會(huì)創(chuàng)立相應(yīng)的控制器實(shí)例初始化之后進(jìn)入一個(gè)循環(huán),或者包含循環(huán)的過(guò)程25/MVC體系結(jié)構(gòu)MVC根本概念及應(yīng)用領(lǐng)域MVC主體結(jié)構(gòu)MVC動(dòng)態(tài)特征MVC實(shí)現(xiàn)一個(gè)例子26/觀察者(Observer)設(shè)計(jì)模式:通知狀態(tài)變化(1)需求有多個(gè)類的狀態(tài)依賴于一個(gè)主類的狀態(tài)變化解決方案多個(gè)類作為觀察者,主類作為被觀察者設(shè)計(jì)一個(gè)觀察者接口,其中包含一個(gè)更新方法,所有觀察者都實(shí)現(xiàn)該接口在主類中保存一個(gè)觀察者隊(duì)列,存放所有觀察者對(duì)象一旦主類狀態(tài)發(fā)生變化,就通知觀察者隊(duì)列改變相應(yīng)類的狀態(tài)27/觀察者(Observer)設(shè)計(jì)模式:通知狀態(tài)變化(2)28/觀察者(Observer)設(shè)計(jì)模式:通知狀態(tài)變化(3)Observer的設(shè)計(jì)接口:每個(gè)具體的觀察者子類都必須實(shí)現(xiàn)自己的更新方法抽象類:更新方法為抽象,但有一些其它方法是所有觀察者子類所共有,可以在基類中實(shí)現(xiàn)具體基類:基類中實(shí)現(xiàn)默認(rèn)的更新方法,需要自己獨(dú)特的更新方法的子類覆蓋基類的更新方法29/觀察者(Observer)設(shè)計(jì)模式:通知狀態(tài)變化(4)每當(dāng)新建一個(gè)觀察者(Observer)時(shí),就要將它注冊(cè)(addObserver方法)給被觀察者(Subject)一旦被觀察者(Subject)的狀態(tài)發(fā)生變化,就必須通知(notifyObservers方法)所有觀察者(Observer)通知的同時(shí),notifyObservers方法循環(huán)調(diào)用所有觀察者的update方法,更新觀察者30/應(yīng)用實(shí)例(1)需求有兩個(gè)窗口,每個(gè)窗口分別有一個(gè)標(biāo)簽和一個(gè)按鈕點(diǎn)擊其中一個(gè)窗口中的按鈕,可以使標(biāo)簽的字體增大,點(diǎn)擊另一個(gè)可以使其字體減小一個(gè)窗口對(duì)字體的改變必須立即反映在另一個(gè)窗口中目的采用MVC模式設(shè)計(jì)實(shí)現(xiàn)使用觀察者〔Observer〕設(shè)計(jì)模式模擬變更-傳播機(jī)制31/應(yīng)用實(shí)例(2):類圖32/應(yīng)用實(shí)例(3):Observer接口interfaceObserver{ //更新函數(shù) publicvoidupdate();}33/應(yīng)用實(shí)例(4):M類classM{ privateintsize=20;//字體大小

//使字體變大

publicvoidenlarge(){ this.setSize(this.getSize()+5); }//使字體變小publicvoidabridge(){ this.setSize(this.getSize()-5);}34/應(yīng)用實(shí)例(5):M類//觀察者隊(duì)列

privateList<Observer>observers=newArrayList<Observer>(); publicvoidaddObservers(Observerobserver){ this.observers.add(observer); } //當(dāng)模型有變更時(shí),通知所有觀察者改變相應(yīng)的視圖

publicvoidnotifyObservers(){ Iterator<Observer>iter=this.observers.iterator(); while(iter.hasNext()){ iter.next().update(); } } ……}35/應(yīng)用實(shí)例(6):C1類classC1implementsActionListener{//一個(gè)控制器與一個(gè)視圖和一個(gè)模型對(duì)應(yīng)privateV1v1;privateMm;//構(gòu)造函數(shù)publicC1(V1v1,Mm){ this.m=m; this.v1=v1;}//向模型注冊(cè)此控制器對(duì)應(yīng)的視圖的觀察者publicvoidregister(){ this.m.addObservers(this.v1);}36/應(yīng)用實(shí)例(7):C1類/***實(shí)現(xiàn)事件監(jiān)聽(tīng)器,*當(dāng)點(diǎn)擊按鈕時(shí),增大標(biāo)簽的字體*/publicvoidactionPerformed(ActionEvente){ this.m.enlarge(); this.m.notifyObservers();}……}37/應(yīng)用實(shí)例(8):V1類classV1implementsObserver{ JLabellabel=newJLabel("MVC"); JButtonbutton=newJButton("增大字體"); privateC1c1;//與視圖V1對(duì)應(yīng)的控制器//實(shí)現(xiàn)Observer接口,當(dāng)有變更時(shí),改變相應(yīng)視圖publicvoidupdate(){ Fontfont=newFont(this.label.getText(),c1.getM().getStyle(), c1.getM().getSize()); this.label.setFont(font);}38/應(yīng)用實(shí)例(9):V1類publicV1(Mm){ //實(shí)例化一個(gè)鏈接此視圖和模型的控制器

c1=newC1(this,m); //注冊(cè)此視圖的觀察者到模型中

c1.register(); …… } ……}39/應(yīng)用實(shí)例(10):主程序TestC2與V2的實(shí)現(xiàn)與C1和V1的實(shí)現(xiàn)相似publicclassTest{/***@paramargs*/publicstaticvoidmain(String[]args){ Mm=newM(); V1v1=newV1(m); V2v2=newV2(m);}}40/典型的WebMVC41/WebMVC實(shí)現(xiàn)早期的JSP標(biāo)準(zhǔn)提出了兩種用JSP技術(shù)建立應(yīng)用程序的方式JSPModel1、JSPModel2Structs框架實(shí)現(xiàn)MVCJava開(kāi)發(fā)WebApp常用的MVC設(shè)計(jì)模式42/JSPmodel143/JSPmodel1適合簡(jiǎn)單應(yīng)用,不能滿足復(fù)雜的大型應(yīng)用程序的實(shí)現(xiàn)。隨意運(yùn)用Model1,會(huì)導(dǎo)致JSP頁(yè)內(nèi)被嵌入大量的腳本片段或Java代碼,特別是當(dāng)需要處理的請(qǐng)求量很大時(shí),情況更為嚴(yán)重。Java程序員實(shí)現(xiàn)沒(méi)問(wèn)題。但導(dǎo)致角色定義不清和職責(zé)分配不明,給工程管理帶來(lái)不必要的麻煩。44/JSPmodel2-MVC模式45/JSPmodel2實(shí)現(xiàn)Model層:實(shí)現(xiàn)業(yè)務(wù)邏輯,可用JavaBean或EJB實(shí)現(xiàn)。封裝了問(wèn)題的核心數(shù)據(jù)、邏輯和功能的計(jì)算關(guān)系。View層:與用戶交互—界面,用JSP實(shí)現(xiàn)。從模型獲得顯示信息,可有不同顯示形式。Controller層:橋梁,分派用戶的請(qǐng)求并選擇恰當(dāng)?shù)囊晥D用于顯示;解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。一般是Servlet46/Struts框架實(shí)現(xiàn)MVC模式47/Controller由ActionServlet構(gòu)成:接受客戶端請(qǐng)求,并調(diào)用model處理請(qǐng)求。ActionServlet讀取Struts-config.xml中的ActionMapping對(duì)象〔實(shí)現(xiàn)了一個(gè)請(qǐng)求到一個(gè)Model局部中Action處理器對(duì)象之間的映射〕;Model中的Action對(duì)象會(huì)完成相關(guān)業(yè)務(wù)操作。處理完畢,該Servlet根據(jù)Struts-config.xml配置轉(zhuǎn)向到適當(dāng)?shù)腏SP頁(yè)面,將處理結(jié)果顯示給用戶。48/ModelAction對(duì)象封裝了具體的處理邏輯,調(diào)用執(zhí)行后把結(jié)果提交適宜的View組件并響應(yīng)。ActionForm對(duì)象,可以通過(guò)定義屬性描述客戶端表單數(shù)據(jù)。開(kāi)發(fā)者可派生子類并利用自定義標(biāo)記庫(kù)實(shí)現(xiàn)對(duì)客戶端的表單數(shù)據(jù)的良好封裝和支持,Action處理器對(duì)象可以直接對(duì)它進(jìn)行讀寫(xiě)。通過(guò)ActionForm組件對(duì)象實(shí)現(xiàn)了對(duì)View和Model之間交互的支持開(kāi)發(fā)者自定義Bean,由Action調(diào)用,完成業(yè)務(wù)處理49/View通過(guò)JSP實(shí)現(xiàn),Struts提供了自定義的標(biāo)記庫(kù),可以非常好地和系統(tǒng)Model局部交互。通過(guò)使用自定義標(biāo)記〔taglibraries〕創(chuàng)立的JSP表單,可以實(shí)現(xiàn)和Model局部中的ActionForm的映射,完成對(duì)用戶數(shù)據(jù)的封裝,同時(shí)這些自定義標(biāo)記還提供了像模板定制等多種顯示功能。50/Struts如何表達(dá)了MVC系統(tǒng)的特點(diǎn)?ActionServlet處理客戶請(qǐng)求,利用配置的ActionMapping對(duì)象把請(qǐng)求映射到Action處理器對(duì)象進(jìn)行處理。Action訪問(wèn)ActionForm中的數(shù)據(jù),處理和響應(yīng)客戶請(qǐng)求,并調(diào)用后臺(tái)Bean組件,執(zhí)行業(yè)務(wù)邏輯;將處理結(jié)果通知ControllerController進(jìn)行下一步處理,如確定后續(xù)顯示頁(yè)面等。51/Structs優(yōu)缺點(diǎn)優(yōu)點(diǎn):1、Struts與Tomcat、Turbine等諸多Apache工程一樣,是開(kāi)源軟件,使開(kāi)發(fā)者能更深入地了解其內(nèi)部的實(shí)現(xiàn)機(jī)制。2、Taglib和頁(yè)面導(dǎo)航。靈活使用能大大提高開(kāi)發(fā)的效率。缺點(diǎn):1、增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。對(duì)于簡(jiǎn)單的界面,嚴(yán)格遵循MVC,降低運(yùn)行效率。2、視圖與控制器間的過(guò)于緊密的連接。視圖與控制器應(yīng)試相互別離的,某些過(guò)于緊密的連接阻礙了它們的獨(dú)立重用。3、視圖對(duì)模型的低效率訪問(wèn)。依據(jù)模型操作接口的不同,視圖可能需要屢次調(diào)用才能獲得足夠顯示的數(shù)據(jù)。52/Spring框架7個(gè)模塊組成。從整體提供了開(kāi)發(fā)企業(yè)級(jí)應(yīng)用所需要的一切。一般不必將系統(tǒng)完全建立在Spring框架上,可以自由選擇適合自己的系統(tǒng)模塊53/AOP模塊O/R映射模塊JDBC和

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論