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

下載本文檔

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

文檔簡介

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

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

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

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

//使字體變大

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論