版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、現(xiàn)代軟件工程,第五部分 軟件體系結(jié)構(gòu)與系統(tǒng)概要設(shè)計(jì),體系結(jié)構(gòu)的基本問(wèn)題-1 面向?qū)ο蟮脑O(shè)計(jì)模式-2 軟件系統(tǒng)的框架與體系結(jié)構(gòu)-3 MVC結(jié)構(gòu)與用戶(hù)界面設(shè)計(jì)-4 基于構(gòu)件的軟件體系結(jié)構(gòu)-5 從需求分析到系統(tǒng)設(shè)計(jì)過(guò)程-6,第五部分 軟件體系結(jié)構(gòu)與系統(tǒng)概要設(shè)計(jì),第五部分 軟件體系結(jié)構(gòu)與系統(tǒng)概要設(shè)計(jì),第四章 MVC結(jié)構(gòu)與用戶(hù)界面設(shè)計(jì) 界面設(shè)計(jì)的可變需求-4.1 MVC的結(jié)構(gòu)-4.2 MVC的實(shí)現(xiàn)-4.3 MVC的變化與評(píng)價(jià)-4.4 基于MVC的用戶(hù)界面設(shè)計(jì)-4.5,用戶(hù)界面是用戶(hù)與系統(tǒng)交互操作的窗口,是用戶(hù)對(duì)系統(tǒng)的直接感受和接觸點(diǎn) 在應(yīng)用系統(tǒng)中,與應(yīng)用邏輯相比較,用戶(hù)界面的變化是系統(tǒng)需求中最容易發(fā)生改
2、變的地方 系統(tǒng)設(shè)計(jì)的一個(gè)重要任務(wù),就是在不改變系統(tǒng)功能的前提下,如何更好地支持和適應(yīng)用戶(hù)不斷變化的變更需求,4.1 界面設(shè)計(jì)的可變需求,基于圖形顯示的應(yīng)用,是使用最廣泛的應(yīng)用。 這個(gè)應(yīng)用模型典型地反映了數(shù)據(jù)存儲(chǔ)與表示的分離。,軟件架構(gòu)與實(shí)際業(yè)務(wù)模型聯(lián)系的密切程度,非常緊密,較緊密,不太緊密,不緊密,最不緊密,系統(tǒng)架構(gòu)與需求變化的關(guān)系,問(wèn)題(1)界面變化的需求與功能無(wú)關(guān) 系統(tǒng)功能是相對(duì)穩(wěn)定的,但是: 同一個(gè)軟件版本的不同類(lèi)型用戶(hù),需要不同的用戶(hù)界面 同一個(gè)系統(tǒng)的不同應(yīng)用(例如:因權(quán)限不同、可打開(kāi)的模塊不同、可看見(jiàn)的數(shù)據(jù)不同),也可能需要構(gòu)成不同的用戶(hù)界面。 不同時(shí)期、不同用戶(hù)的不同表現(xiàn)喜好,需要
3、不同的界面 因此,如果把用戶(hù)界面與實(shí)現(xiàn)功能緊密結(jié)合,則隨著用戶(hù)界面的不同或更改,系統(tǒng)的靈活性和需求變更的工作量將無(wú)比巨大。 問(wèn)題(2)界面變化的需求與功能有關(guān) 同一種信息可以在不同的地方有不同的表示 應(yīng)用程序的顯示和動(dòng)作必須立即反映出數(shù)據(jù)的變化 用戶(hù)的接口易于改變,甚至在運(yùn)行時(shí)刻也可以改變 支持不同的窗口系統(tǒng),或者用戶(hù)界面的基礎(chǔ)軟件,2.1 界面設(shè)計(jì)的可變需求,對(duì)系統(tǒng)界面部分的要求: 具有靈活的人-機(jī)界面的交互方式 可以靈活選擇不同的信息表示方式 可以靈活選擇用戶(hù)的操作方式 當(dāng)然,這里靈活必須保證是在一定限度內(nèi),不可能是無(wú)限的 困難: 必須滿(mǎn)足界面構(gòu)成與系統(tǒng)計(jì)算模型的獨(dú)立 模型視圖控制器MVC
4、(Model-View-Controller)就是一種交互界面的結(jié)構(gòu)組織模式 模型視圖控制器是在世紀(jì)年代,隨著SmallTalk-80而流行起來(lái)的設(shè)計(jì)模式。它是一個(gè)十分有效的設(shè)計(jì)模式,廣泛用于圖形用戶(hù)界面的設(shè)計(jì)中。 MVC強(qiáng)調(diào)把用戶(hù)輸入、數(shù)據(jù)模型和圖像顯示以模塊的方式分開(kāi)設(shè)計(jì)。,2.1 界面設(shè)計(jì)的可變需求,模型-視圖-控制器(MVC)模式,MVC模式將一個(gè)交互式應(yīng)用程序分成3個(gè)部件 模型(model):軟件所處理的核心邏輯,包含核心功能和數(shù)據(jù) 視圖(View):向用戶(hù)顯示信息,對(duì)相同的信息可以有不同的顯示 控制器(Controller):處理用戶(hù)的輸入(如:鼠標(biāo)、鍵盤(pán)等),轉(zhuǎn)化成用戶(hù)對(duì)模型或視
5、圖的服務(wù)請(qǐng)求,并把信息的變化,傳遞給視圖。用戶(hù)僅通過(guò)控制器與系統(tǒng)交互 一組視圖和控制器組成了一個(gè)用戶(hù)界面 一個(gè)模型可以有多個(gè)視圖界面,如果用戶(hù)通過(guò)某個(gè)視圖的控制器,改變了模型的數(shù)據(jù),控制器會(huì)將這個(gè)變化,通知所有視圖,導(dǎo)致顯示的更新。 這是典型的觀察者(Observer)或稱(chēng)為:發(fā)布-訂閱(publish-subscribe)、變更-傳播模式。這種機(jī)制保證了模型和用戶(hù)界面之間的一致性。,行為型模式7:觀察者(Observer),意圖: 定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴(lài)于他的對(duì)象都得到通知并被自動(dòng)更新。 動(dòng)機(jī): 把一個(gè)系統(tǒng)分解成一些相互協(xié)作的類(lèi)或者對(duì)象,有一個(gè)
6、問(wèn)題,就是如何維護(hù)這些相關(guān)的類(lèi)/對(duì)象的一致性? 一致性是協(xié)作的需要,但太緊密,又導(dǎo)致緊偶合 觀察者模式的典型應(yīng)用是MVC結(jié)構(gòu) 這個(gè)模式,也稱(chēng)為發(fā)布-訂閱(publish-subscribe)模式。目標(biāo)是通知的發(fā)布者,它發(fā)出通知時(shí),并不知道誰(shuí)是訂閱者、有多少訂閱者、是什么樣的訂閱者。,4.2 MVC的結(jié)構(gòu),將應(yīng)用程序分成三個(gè)部分: 模型組件:封裝了內(nèi)核數(shù)據(jù)和功能。模型獨(dú)立于特定輸出表示或者輸入方式。 視圖組件向用戶(hù)顯示信息。視圖從模型獲得數(shù)據(jù)。一個(gè)模型可能有多個(gè)視圖。 每個(gè)視圖有一個(gè)相關(guān)的控制器組件??刂破鹘M件接受輸入,通常將鼠標(biāo)移動(dòng)、CLICK等用戶(hù)輸入翻譯成為對(duì)視圖或者模型的服務(wù)器請(qǐng)求。用戶(hù)
7、僅僅通過(guò)控制器與系統(tǒng)交互。,MVC結(jié)構(gòu)1模型,模型部件包含了應(yīng)用程序的功能內(nèi)核。 封裝了相應(yīng)的數(shù)據(jù) 封裝了完成問(wèn)題處理的過(guò)程,控制器代表用戶(hù)調(diào)用這些過(guò)程。 模型也提供訪問(wèn)它封裝的數(shù)據(jù)的函數(shù),視圖為了獲得顯示數(shù)據(jù),通過(guò)函數(shù)對(duì)這些數(shù)據(jù)進(jìn)行訪問(wèn)操作 變更-傳播機(jī)制 維護(hù)了一個(gè)注冊(cè)表,各部件通過(guò)注冊(cè)表建立相互依賴(lài)關(guān)系 所有視圖還有一些控制器在這個(gè)表中登記了對(duì)變更通知的需求。 模型狀態(tài)的改變將觸發(fā)變更-傳播機(jī)制。每個(gè)在表中登記的視圖和控制器都會(huì)收到 變更通知。 變更-傳播機(jī)制是模型與視圖控制器之間的唯一連接。,MVC結(jié)構(gòu)2視圖,視圖部件向用戶(hù)呈現(xiàn)信息 不同的視圖用不同的方法呈現(xiàn)信息。 每個(gè)視圖部件都有一
8、個(gè)更新操作。這個(gè)操作被模型變更通知激活(視圖被動(dòng)地更新)。 這個(gè)操作被激活(此時(shí)模型已經(jīng)改變)后,視圖得到新的模型數(shù)據(jù),視圖和模型重新一致。 在初始化階段,通過(guò)建立注冊(cè)關(guān)系(訂閱),視圖向模型登記請(qǐng)求變更通知(視圖主動(dòng)地更新)。 每個(gè)視圖創(chuàng)建一個(gè)相應(yīng)的控制器,視圖給控制器可以處理顯示的操作,因此,控制器具有可以主動(dòng)激發(fā)更新界面的能力,MVC結(jié)構(gòu)3控制器,控制器與視圖 控制器獲得事件輸入,如何獲得事件與用戶(hù)界面平臺(tái)有關(guān),例如:是命令行、還是鼠標(biāo)點(diǎn)擊等 事件被翻譯成為對(duì)模型或者視圖的請(qǐng)求(視圖對(duì)模型的操作激發(fā))或模型對(duì)視圖的更新(雙向功能) 控制器本身也是一個(gè)獨(dú)立的功能部件 如果控制器的行為依賴(lài)于
9、模型的狀態(tài)(例如:由模型的狀態(tài),決定控制器允許或不允許進(jìn)行某類(lèi)操作),那么控制器也需要向變更-傳播機(jī)制注冊(cè),模型為控制器建立一個(gè)操作。 當(dāng)模型狀態(tài)變化時(shí),變更-傳播機(jī)制像處理視圖一樣,為控制器提供一個(gè)更新操作,使控制器改變操作行為(例如:關(guān)閉或打開(kāi)某種操作),MVC的結(jié)構(gòu)關(guān)系(面向?qū)ο蟮膶?shí)現(xiàn)),attach getData,create,manipulate display,attach call service,視圖和控制器都在變更-傳播機(jī)制下,因此,具有同一個(gè)父類(lèi)和更新接口update(),在必要的時(shí)候,向模型注冊(cè)和撤消注冊(cè),通過(guò)觀察器獲得變化和更新。,視圖和控制器是同一個(gè)父類(lèi),MVC的動(dòng)
10、態(tài)行為關(guān)系,狀態(tài)查詢(xún),通知改變,狀態(tài)改變,視圖選擇,用戶(hù)請(qǐng)求,改變請(qǐng)求,用戶(hù)輸入導(dǎo)致模型變化,并觸發(fā)變更-傳遞機(jī)制的過(guò)程,Controller,event,Model,service,View,update,display,update,getdata,getdata,MVC的動(dòng)態(tài)行為關(guān)系,輸入事件,結(jié)束處理,MVC的動(dòng)態(tài)行為關(guān)系,用戶(hù)輸入導(dǎo)致模型變化,并觸發(fā)變更-傳遞機(jī)制。 控制器接受到事件,解釋事件并且啟動(dòng)模型的服務(wù)過(guò)程。 模型執(zhí)行相應(yīng)的過(guò)程,并導(dǎo)致內(nèi)部狀態(tài)的變化。 模型調(diào)用其更新過(guò)程,向所有登記請(qǐng)求了變更-傳播機(jī)制的視圖和控制器發(fā)出通知。 每個(gè)視圖從模型中讀取新數(shù)據(jù)并且重新顯示。 每個(gè)控
11、制器從模型中讀取新數(shù)據(jù),修改自己的行為,比如禁用某個(gè)功能。 最初的控制器恢復(fù)控制并從事件處理過(guò)程返回。,4.3 MVC的實(shí)現(xiàn),實(shí)現(xiàn)基于MVC的應(yīng)用,一般有以下幾個(gè)步驟: (1)分析應(yīng)用問(wèn)題,分離系統(tǒng)的 內(nèi)核功能 對(duì)功能的控制 輸入/輸出行為,三大部分; (2)設(shè)計(jì)和實(shí)現(xiàn)每一個(gè)視圖; (3)設(shè)計(jì)和實(shí)現(xiàn)每一個(gè)控制器; (4)設(shè)計(jì)模型部件,使其封裝內(nèi)核數(shù)據(jù)和計(jì)算、功能,提供訪問(wèn)數(shù)據(jù)、控制內(nèi)部行為、以及其他必要的操作。,4.3 MVC的實(shí)現(xiàn)(1),步驟一: 分析問(wèn)題,把系統(tǒng)的內(nèi)核功能、對(duì)功能的控制和輸入/輸出行為,分解為模型、控制器和視圖三大部分 具體步驟是: (1)確定要顯示的數(shù)據(jù)(顯示數(shù)據(jù)) (2
12、)設(shè)計(jì)對(duì)數(shù)據(jù)的訪問(wèn)操作(數(shù)據(jù)操作) (3)確定模型的哪一部分是自動(dòng)顯示、哪一部分應(yīng)該通過(guò)控制器操作向用戶(hù)顯示(控制操作) (4)設(shè)計(jì)模型自己的內(nèi)部計(jì)算和控制功能(內(nèi)部方法與控制) 如果沒(méi)有控制操作的需要(沒(méi)有明顯的控制器作用),MVC模式反而增加了系統(tǒng)的復(fù)雜性、降低了響應(yīng)的速度。例如:簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,沒(méi)有必要都采用MVC模式,4.3 MVC的實(shí)現(xiàn)(1),需求: 一個(gè)應(yīng)用系統(tǒng)可以有不同的用戶(hù)(普通用戶(hù)、專(zhuān)業(yè)用戶(hù)、高級(jí)用戶(hù)和維護(hù)用戶(hù)等),不同的用戶(hù)具有不同的訪問(wèn)權(quán)限、界面和功能。 系統(tǒng)首先接受注冊(cè),并提供請(qǐng)求的服務(wù) 同時(shí),對(duì)專(zhuān)業(yè)或高級(jí)用戶(hù),當(dāng)數(shù)據(jù)發(fā)生變化時(shí),應(yīng)反向提供通知和顯示 典型的觀察者(O
13、bserver)機(jī)制(MVC) 這是典型的觀察者模式,也稱(chēng)為發(fā)布-訂閱(publish-subscribe)模式。 顯示內(nèi)容與數(shù)據(jù)密切相關(guān),數(shù)據(jù)是目標(biāo),顯示是觀察者或訂閱者。 目標(biāo)的改變要讓觀察者都知道,并做出相應(yīng)的改變。觀察者的數(shù)量、顯示方式都是不確定的。 目標(biāo)是通知的發(fā)布者,它發(fā)出通知時(shí),并不知道誰(shuí)是訂閱者、有多少訂閱者、是什么樣的訂閱者。 模型部件作為目標(biāo)出版者,視圖和控制器作為觀察者、訂閱者。 注冊(cè)是一個(gè)特定過(guò)程,使得視圖和控制器可以向出版者自由訂閱和退定。 模型的內(nèi)容如果改變了狀態(tài),需要通知每個(gè)訂閱者,4.3 MVC的實(shí)現(xiàn)(1),Class Observer /建立視圖和控制器的公共
14、基類(lèi) public: virtual void update( ) /默認(rèn)的更新操作函數(shù) ; Class Model /模型類(lèi) Public: / 模型內(nèi)核數(shù)據(jù)的計(jì)算函數(shù) / 視圖和控制器讀取模型提供的數(shù)據(jù)的接口函數(shù) void attach (Observer *s); /注冊(cè)方法 void detach (Observer *s); /撤消注冊(cè)方法 virtual void notify ( ); / 對(duì)registry中的所有觀察器進(jìn)行循環(huán), private: 依次通知它們,模型數(shù)據(jù)發(fā)生了變化, 并調(diào)用它們的update( )方法,實(shí)現(xiàn)數(shù)據(jù)更新 /模型內(nèi)核數(shù)據(jù) collection reg
15、istry; /建立并維持所有視圖和控制器的 ; 注冊(cè)關(guān)系,1、首先,定義一個(gè)視圖與控制器的公共基類(lèi),然后定義模型類(lèi) 2、建立視圖與控制器類(lèi)與模型類(lèi)的注冊(cè)關(guān)系 3、在模型類(lèi)方法中,形成變化-傳播機(jī)制,步驟二:設(shè)計(jì)并實(shí)現(xiàn)每一個(gè)視圖功能 設(shè)計(jì)每一個(gè)視圖的外觀,通過(guò)畫(huà)圖方法,將模型數(shù)據(jù)顯示在屏幕上(與用戶(hù)具體的界面平臺(tái)有關(guān))。 實(shí)現(xiàn)視圖的初始化過(guò)程: 建立視圖與控制器的聯(lián)系 支持變更-傳遞機(jī)制;初始化控制器 向模型注冊(cè)、初始化對(duì)模型的引用 實(shí)現(xiàn)更新方法來(lái)反映模型的變化,更新實(shí)現(xiàn)的策略包括: 可以簡(jiǎn)單地調(diào)用畫(huà)圖功能,但是不適應(yīng)模型頻繁變化的情況。 向更新方法提供一些參數(shù)來(lái)確定是否重畫(huà),以及重畫(huà)范圍。
16、可以通過(guò)累積變化的方式減少重畫(huà)的頻率。 更新方法的啟動(dòng)包括:主動(dòng)、被動(dòng),4.3 MVC的實(shí)現(xiàn)(2),Class view : public observer public: view (model *m) : myModel(m),myController(0) /初始化對(duì)模型的引用 myModel - attach(this); /向模型注冊(cè) virtual View ( ) myModel - detach(this); /撤消向模型注冊(cè) virtual void update( ) this - draw( ) ; virtual void initialize( ) /默認(rèn)的視圖初始化
17、 virtual void draw( ) ; /繪制刷新屏幕顯示 void setModel(Model *m) myModel = m ; ) Model *getModel ( ) return myModel ; void setController(Controller *c) myController = c ; controller *getController( ) return MyController ; Protected ; Model *myModel ; Controller *myController ; ;,4.3 MVC的實(shí)現(xiàn)(2),設(shè)計(jì)并實(shí)現(xiàn)控制器 對(duì)于每個(gè)
18、視圖,指定回應(yīng)用戶(hù)動(dòng)作的系統(tǒng)行為。 在模型狀態(tài)的影響下,控制器用一個(gè)特定的方法,來(lái)接受并且解釋這些用戶(hù)動(dòng)作(事件)。 設(shè)計(jì)并實(shí)現(xiàn)視圖-控制器關(guān)系 視圖在其初始化期間創(chuàng)建和它關(guān)聯(lián)的控制器。 視圖、控制器、模型之間的實(shí)現(xiàn)策略 可以考慮使用命令(command)設(shè)計(jì)模式來(lái)隔離模型和視圖之間的聯(lián)系視圖與模型的無(wú)關(guān)性。 可以考慮使用工廠方法(factory method)設(shè)計(jì)模式來(lái)建立視圖和控制器的關(guān)聯(lián)關(guān)系動(dòng)態(tài)選擇控制器。,4.3 MVC的實(shí)現(xiàn)(3),實(shí)現(xiàn)MVC的總體的初始化部分 首先初始化模型。 創(chuàng)建和初始化視圖。 初始化之后進(jìn)入一個(gè)循環(huán),或者包含循環(huán)的過(guò)程。 在MFC中使用AppWizard時(shí),這個(gè)
19、部分通常已經(jīng)被實(shí)現(xiàn)了。 創(chuàng)建動(dòng)態(tài)視圖 如果應(yīng)用程序允許動(dòng)態(tài)打開(kāi)和關(guān)閉視圖,那么可以提供用來(lái)管理這些視圖的組件。 該組件可以在最后一個(gè)視圖被關(guān)閉的時(shí)候終止程序。,4.3 MVC的實(shí)現(xiàn)(4),MVC的初始化過(guò)程,創(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)始處理事件。,可插入的控制器 視圖和控制器之間可以分離以支持一個(gè)視圖與不同控制器的組合。 這種靈活性可以用來(lái)實(shí)現(xiàn)操作的不同模式
20、,例如:不同的用戶(hù),或在應(yīng)用中,集成新的輸入/輸出設(shè)備。,MVC的更進(jìn)一步發(fā)展,視圖,控制器,模型,視圖,控制器1,模型,控制器2,控制器3,層次化視圖和控制器的基礎(chǔ)結(jié)構(gòu) 一個(gè)用戶(hù)的視圖,可以對(duì)應(yīng)一組事先構(gòu)建好的控制器對(duì)象,可以考慮組合(composite)設(shè)計(jì)模式來(lái)實(shí)現(xiàn)這樣的處理。在控制器與模型之間,則采用外觀模式,提供統(tǒng)一的接口,MVC的更進(jìn)一步發(fā)展,組合模式,外觀模式,MVC的更進(jìn)一步發(fā)展,層次化視圖和控制器的基礎(chǔ)結(jié)構(gòu) 當(dāng)有多個(gè)控制器的時(shí)候,可以考慮職責(zé)鏈(Chain of Responsibility)設(shè)計(jì)模式來(lái)處理。,視圖,控制器2.1,模型,控制器3.1,控制器4.1,控制器1,控
21、制器2.2,控制器3.3,控制器3.2,控制器4.3,控制器4.2,控制器的責(zé)任鏈,進(jìn)一步去除系統(tǒng)依賴(lài)性 可以考慮建立一個(gè)視圖類(lèi)和控制器類(lèi)的集合,希望這些類(lèi)的實(shí)現(xiàn)是平臺(tái)無(wú)關(guān)的。 可以考慮使用橋接(Bridge)模式,在這些類(lèi)和基礎(chǔ)平臺(tái)軟件之間建立一個(gè)隔離層。,MVC的更進(jìn)一步發(fā)展,優(yōu)點(diǎn): 可以為一個(gè)模型在運(yùn)行時(shí),同時(shí)建立和使用多個(gè)視圖。變更-傳播機(jī)制可以確保所有相關(guān)的視圖及時(shí)得到模型數(shù)據(jù)的變化,從而使所有關(guān)聯(lián)的視圖和控制器做到顯示與行為同步 可插入的視圖和控制器 視圖與控制器的可接插性,允許更換視圖和控制器對(duì)象,并且可以根據(jù)需求動(dòng)態(tài)地打開(kāi)或關(guān)閉,甚至在運(yùn)行期間進(jìn)行對(duì)象替換 模型的可移植性 因?yàn)?/p>
22、模型是獨(dú)立于視圖的,所以,可以把一個(gè)模型獨(dú)立地移植到新的平臺(tái)上,需要做的只是在新平臺(tái)上對(duì)視圖和控制器進(jìn)行修改 潛在的框架結(jié)構(gòu) 可以基于此模式,建立應(yīng)用系統(tǒng)的靈活框架,不僅僅只在涉及界面的設(shè)計(jì)中(MVC的進(jìn)一步發(fā)展),4.4 MVC的變化與評(píng)價(jià),缺點(diǎn)1: 增加了系統(tǒng)的復(fù)雜性 有時(shí)獲得的靈活性并不大,但是卻增加了系統(tǒng)的復(fù)雜性(控制器作用并不大,但系統(tǒng)層次增加)。 潛在的更新因素導(dǎo)致系統(tǒng)紊亂 有時(shí)一個(gè)用戶(hù)動(dòng)作就導(dǎo)致很多更新。有些更新并不是所有的視圖都關(guān)心。對(duì)動(dòng)作的錯(cuò)誤理解,導(dǎo)致整體信息紊亂。 視圖和控制器之間的緊密聯(lián)系 控制器和視圖之間的聯(lián)系非常緊密,妨礙了模塊的獨(dú)立性。 視圖和控制器與模型的緊密耦
23、合 視圖和控制器直接調(diào)用模型。模型接口的改變會(huì)使得視圖和控制器的代碼過(guò)時(shí)。,4.4 MVC的變化與評(píng)價(jià),缺點(diǎn)2: 視圖中數(shù)據(jù)訪問(wèn)的低效率 數(shù)據(jù)訪問(wèn)依賴(lài)于模型接口??赡苓^(guò)多地訪問(wèn)不必要的數(shù)據(jù)。 增加控制器層次,降低了訪問(wèn)模型的效率,特別是大用戶(hù)數(shù)的情況下。 移植時(shí)對(duì)視圖和控制器的修改是不可避免的。 視圖和控制器中的軟件包含了平臺(tái)相關(guān)的東西。 借用現(xiàn)代的用戶(hù)接口工具使用MVC的困難性 現(xiàn)代的用戶(hù)接口工具中提供了預(yù)制的控制流管理,內(nèi)部事件的處理等,對(duì)MVC支持困難,4.4 MVC的變化與評(píng)價(jià),界面設(shè)計(jì)的三個(gè)主題,A:對(duì)象適配器,(實(shí)現(xiàn)),B,MVC框架都可以使界面獨(dú)立于數(shù)據(jù)。由此,數(shù)據(jù)可以通過(guò)不同的
24、界面提供給外界使用,數(shù)據(jù)得到各種設(shè)計(jì)樣式的表現(xiàn)。這種框架結(jié)構(gòu)可以用在單一的軟件部分,也可用在客戶(hù)機(jī)/服務(wù)器中的不同部件中。 我們舉一反三地介紹一些基于MVC的界面設(shè)計(jì)應(yīng)用, A, A_I m p l,B,implements,4.5 基于MVC的用戶(hù)界面設(shè)計(jì),B 對(duì)象管理器,C 服 務(wù) 界 面,(實(shí)施), A, A_I m p l,B,implements,(實(shí)現(xiàn)), A_I m p l,B,implements, A,對(duì) 象 封 裝 器,定 義,對(duì)象封裝器就是用來(lái)把一些東西包裝起來(lái),使它們有面向?qū)ο蟮耐庠诮缑妗?*被包裝的東西,很可能不是面向?qū)ο?,而是由前人遺留下來(lái)的應(yīng)用。這些應(yīng)用被對(duì)象包裝
25、之后,就可以和企業(yè)系統(tǒng)里的其他分布式對(duì)象對(duì)話(huà),這正是大規(guī)模企業(yè)應(yīng)用的整合的基本精神。,從界面設(shè)計(jì)的角度看,對(duì)象封裝器只不過(guò)是界面的基本應(yīng)用。首先定義一個(gè)封裝器界面,其中包括現(xiàn)有應(yīng)用中公開(kāi)的運(yùn)算。然后,通過(guò)調(diào)用現(xiàn)有應(yīng)用的函數(shù),來(lái)實(shí)施封裝界面。,封裝器界面實(shí)施對(duì)象序列圖,Client, Wrapper,Legacy Code,Wrapped Application (封裝應(yīng)用),調(diào)用封裝器的運(yùn)算,返回,調(diào)用函數(shù),返回,對(duì)象封裝器可以看成是對(duì)象適配器的簡(jiǎn)單情形,對(duì) 象 適 配 器,對(duì)象封裝器把現(xiàn)有對(duì)象轉(zhuǎn)換成一個(gè)特定的,與原來(lái)對(duì)象不一樣的界面,它是對(duì)象封裝器的更普遍形式。對(duì)象適配器通常含有現(xiàn)有對(duì)象,即
26、被適配對(duì)象的引址,而現(xiàn)有對(duì)象則以服務(wù)類(lèi)的姿態(tài)出現(xiàn)。,定 義, USER, USER IMPL,Mainframe USER,適配器的例子,用戶(hù)界面實(shí)施類(lèi)(User I m p l)把主機(jī)用戶(hù)(Mainframe User)對(duì)象適配成用戶(hù)界面(User),對(duì)象工廠和管理器, Service Factory, My Service Factory, Service, My Service,一個(gè)對(duì)象工廠樣式,Creates (構(gòu)造),Implements (實(shí)現(xiàn)),Implements (實(shí)現(xiàn)),1,*,上圖給出了一個(gè)構(gòu)造“服務(wù)”對(duì)象(service)的工廠。構(gòu)造(create)運(yùn)算由界面“服務(wù)工廠
27、”(Service Factory)定義?!拔业姆?wù)工廠”(My Service Factory)和“我的服務(wù)”(My Service)都是界面實(shí)施類(lèi),它們之間的關(guān)聯(lián),是給前者管理后者時(shí)使用的。,對(duì)象工廠樣式的詳細(xì)設(shè)計(jì)例子,Service Factory,Create( ):Service/構(gòu)造服務(wù) Find(service Name:String) :Service /尋找服務(wù),Service,Get Name( ):String/提取名,Perform Service( ) /履行服務(wù),上圖中的界面“服務(wù)工廠”(Service Factory)中定義了構(gòu)造(create)和尋找(find)
28、服務(wù)器運(yùn)算?!胺?wù)”(Service)則有提取名字(get Name)和履行服務(wù)(perform Service)。 使用服務(wù)工廠的好處之一是設(shè)立一個(gè)控制客戶(hù)來(lái)訪的前端。,界面和服務(wù)類(lèi),和正常的類(lèi)一樣,界面也可以用來(lái)作服務(wù)類(lèi)。這樣做的目的,通常是為了增加靈活性。,銀行要管理多個(gè)賬戶(hù),因而銀行對(duì)象要支持一個(gè)賬戶(hù)管理器的界面。一個(gè)辦法是直接在銀行類(lèi)中實(shí)施該界面,如圖所示,Implements (實(shí)現(xiàn)),bank, Account Mgr, Account Mgr I m p l,Implements (實(shí)現(xiàn)),1,1,servant,a,b,手柄本體樣式結(jié)構(gòu),上頁(yè)的圖a中表示銀行類(lèi)直接實(shí)施賬戶(hù)管理
29、器界面。圖b表示銀行類(lèi)把上述界面用作服務(wù)類(lèi),這樣就可以有不同的賬戶(hù)管理器實(shí)施類(lèi)。然而,一個(gè)固定不變的界面實(shí)施,對(duì)于銀行的限制可能太大。為了增加靈活性,并能夠在運(yùn)行期間才和具體的實(shí)施連接起來(lái),可以吧賬戶(hù)管理器界面作為銀行的服務(wù)類(lèi)。,bank, Account Mgr, Type A I m p l, Type B I m p l,以上的靈活性,還可以進(jìn)一步提升。假設(shè)同一間銀行,有幾個(gè)不同的賬戶(hù)管理器實(shí)施類(lèi),則可以按需要選一個(gè)作為銀行的服務(wù)類(lèi),而銀行對(duì)象本生無(wú)需作任何改變。,事件處理中的服務(wù)界面,事件(event)是引發(fā)對(duì)象間作聯(lián)絡(luò)的事情,也是對(duì)象之間對(duì)話(huà)的一個(gè)片段。事件可以是直接的。一個(gè)對(duì)象調(diào)用
30、另一個(gè)對(duì)象的運(yùn)算,就是直接事件。事件也可以是間接的。對(duì)象通過(guò)事件服務(wù)或事件管理器,間接地與其他對(duì)象聯(lián)絡(luò)對(duì)話(huà)。 每個(gè)事件都有兩個(gè)參與者。事件供應(yīng)者產(chǎn)生并發(fā)送事件的數(shù)據(jù),而使用者則接受和處理事件的數(shù)據(jù)。 根據(jù)誰(shuí)發(fā)起事件數(shù)據(jù)的傳送,事件可分作兩個(gè)類(lèi)型。在“推出式”事件中,供應(yīng)者發(fā)起數(shù)據(jù)傳送。而在“拉進(jìn)式”事件中,發(fā)起者是使用者。 要定義事件是怎樣傳送的,特別是推出式和拉進(jìn)式事件,界面是很好的工具。,在可以傳送事件以前,發(fā)起的對(duì)象一定要有供應(yīng)者或使用者的對(duì)象引址。對(duì)推出式事件,使用者可向供應(yīng)者登記其實(shí)施對(duì)象。這樣,供應(yīng)者就持有使用者對(duì)象的引址,(如圖a所示)而后者則起服務(wù)類(lèi)的作用。, Consumer
31、, Consumer,Supplier,implements,(實(shí)現(xiàn)),推出事件,a,至于拉進(jìn)式事件,使用者以供應(yīng)者為服務(wù)類(lèi),因而可以從后者拉進(jìn)數(shù)據(jù)(如圖b)。,Consumer, Supplier, Supplier,implements,(實(shí)現(xiàn)),拉進(jìn)事件,1簡(jiǎn)單事件的推出和觀察者, Listener Process Event( )/處理事件,Timer Delay :Integer/延遲時(shí)間 Listener:Listener /收聽(tīng)者 Timer(delay:Integer,listener:Listener) Start( ) /開(kāi)始 Stop( )/停止, Listener I
32、m p l,Timer(記時(shí)器) 的構(gòu)造程式 建立連接,implements,(實(shí)現(xiàn)),記時(shí)器持有收聽(tīng)器界面作為服務(wù)類(lèi),而后者也就是事件的使用者。兩者之間的連接,由記時(shí)器的構(gòu)造程式建立。記時(shí)器對(duì)象構(gòu)造好后,即調(diào)用“開(kāi)始”運(yùn)算。經(jīng)過(guò)一定的延遲時(shí)間,記時(shí)器調(diào)用收聽(tīng)器的處理事件運(yùn)算,并由此發(fā)送一個(gè)事件。,記時(shí)器作為簡(jiǎn)單推出式事件的供應(yīng)者,觀察者樣式, Observer Update(.)/更新, Observer I m p l, Observable Add Observer(o:Observer) /增加觀察者 Remove Observer(o:Observer) /除去觀察者, Observ
33、able I m p l,連接由add Observer (增加觀察者)建立,觀察者的實(shí)施類(lèi)Observer I m p l,先取得一個(gè)可觀察物的引址。然后,調(diào)用可觀察物的增加觀察者運(yùn)算,把觀察者實(shí)施類(lèi)加到可觀察物的觀察者列表中,并由此建立可觀察物和觀察者之間的連接。當(dāng)有事件發(fā)生時(shí),可觀察物的實(shí)施類(lèi)逐一檢出其列表中的觀察者,并調(diào)用其更新運(yùn)算。這樣,事件就發(fā)放到所有觀察者處,而事件數(shù)據(jù)則可作為更新運(yùn)算的輸入變量來(lái)傳送。,2 從服務(wù)器對(duì)象作逆向調(diào)用,在客戶(hù)機(jī)/服務(wù)器的環(huán)境中,逆向調(diào)用是推出式事件,它由服務(wù)器發(fā)起,事件直接傳送到客戶(hù)機(jī)處。由于與一般客戶(hù)機(jī)/服務(wù)器對(duì)話(huà)方向相反,故稱(chēng)為“逆向”。 客戶(hù)機(jī)之所以能作逆向調(diào)用,是因?yàn)榭蛻?hù)機(jī)預(yù)先把自己的一個(gè)對(duì)象引址,送給服務(wù)器對(duì)象存用。服務(wù)器拿著這個(gè)對(duì)象引址,當(dāng)然就可以直接調(diào)用客戶(hù)機(jī)的運(yùn)算。從對(duì)象結(jié)構(gòu)來(lái)看,逆向調(diào)用就是把觀察者樣式應(yīng)用在客戶(hù)機(jī)/服務(wù)器的情況下。這里,可觀察物是服務(wù)器的對(duì)象,觀察者則是客戶(hù)機(jī)中的對(duì)象。,聊天室應(yīng)用的逆向調(diào)用界面設(shè)計(jì)樣式, Chat User Get Name( ):String/提取名字
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 縮口模課程設(shè)計(jì)
- 二零二五年健康產(chǎn)業(yè)合伙創(chuàng)業(yè)合同書(shū)3篇
- 甘蔗特色主題課程設(shè)計(jì)
- 2025版茶葉品牌戰(zhàn)略規(guī)劃合同3篇
- 2025版商標(biāo)使用權(quán)轉(zhuǎn)讓買(mǎi)賣(mài)合同3篇
- 2025版辦公室裝修與室內(nèi)空氣凈化服務(wù)合同6篇
- 給母親的感謝信模板集錦6篇
- 紅色基因課程設(shè)計(jì)理念
- 二零二五年家政鐘點(diǎn)工雇傭合同-含意外傷害賠償協(xié)議3篇
- 綜合布線(xiàn)課程設(shè)計(jì)cad
- 神經(jīng)網(wǎng)絡(luò)-BP算法-課件
- 假結(jié)婚私下協(xié)議書(shū)
- 工程監(jiān)督中心鉆井液監(jiān)督培訓(xùn)教材
- 附件1:中國(guó)聯(lián)通動(dòng)環(huán)監(jiān)控系統(tǒng)B接口技術(shù)規(guī)范(V3.0)
- 運(yùn)維人員崗位培訓(xùn)(通信電源)實(shí)操手冊(cè)
- 鍋爐車(chē)間輸煤機(jī)組 PLC電氣控制系統(tǒng)設(shè)計(jì)
- 專(zhuān)題01《水銀花開(kāi)的夜晚》 高考語(yǔ)文二輪復(fù)習(xí)
- 文件簽發(fā)單(標(biāo)準(zhǔn)模版)
- GB/T 9081-2008機(jī)動(dòng)車(chē)燃油加油機(jī)
- 施工臨時(shí)用電安全隱患大全對(duì)錯(cuò)圖示一目了然
- 國(guó)家開(kāi)放大學(xué)《經(jīng)濟(jì)數(shù)學(xué)基礎(chǔ)12》形考作業(yè)1-4
評(píng)論
0/150
提交評(píng)論