狀態(tài)模式課件_第1頁
狀態(tài)模式課件_第2頁
狀態(tài)模式課件_第3頁
狀態(tài)模式課件_第4頁
狀態(tài)模式課件_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

DesignPatterns狀態(tài)模式大綱狀態(tài)模式概述狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的應(yīng)用實例共享狀態(tài)使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換狀態(tài)模式的優(yōu)缺點與適用環(huán)境狀態(tài)模式狀態(tài)模式概述H2O的三種狀態(tài)(未考慮臨界點)狀態(tài)模式狀態(tài)模式概述分析在軟件系統(tǒng)中:有些對象具有多種狀態(tài)這些狀態(tài)在某些情況下能夠相互轉(zhuǎn)換對象在不同的狀態(tài)下將具有不同的行為復(fù)雜的條件判斷語句來進行狀態(tài)的判斷和轉(zhuǎn)換操作

導(dǎo)致代碼的可維護性和靈活性下降

出現(xiàn)新的狀態(tài)時,代碼的擴展性很差,客戶端代碼也需要進行相應(yīng)的修改,違背了開閉原則classTestXYZ{intbehaviour;//GetterandSetter......publicvoidHandleAll(){if(behaviour==0){//dosomething}elseif(behaviour==1){//dosomething}elseif(behaviour==2){//dosomething}elseif(behaviour==3){//dosomething}...somemoreelseif...}}狀態(tài)模式狀態(tài)模式概述狀態(tài)模式的定義對象行為型模式狀態(tài)模式:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。StatePattern:Allowanobjecttoalteritsbehaviorwhenitsinternalstatechanges.Theobjectwillappeartochangeitsclass.狀態(tài)模式狀態(tài)模式概述狀態(tài)模式的定義又名狀態(tài)對象(ObjectsforStates)用于解決系統(tǒng)中復(fù)雜對象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問題將一個對象的狀態(tài)從該對象中分離出來,封裝到專門的狀態(tài)類中,使得對象狀態(tài)可以靈活變化對于客戶端而言,無須關(guān)心對象狀態(tài)的轉(zhuǎn)換以及對象所處的當前狀態(tài),無論對于何種狀態(tài)的對象,客戶端都可以一致處理狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的結(jié)構(gòu)狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的結(jié)構(gòu)狀態(tài)模式包含以下3個角色:Context(環(huán)境類)State(抽象狀態(tài)類)ConcreteState(具體狀態(tài)類)狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的抽象狀態(tài)類代碼:abstractclassState{//聲明抽象業(yè)務(wù)方法,不同的具體狀態(tài)類可以有不同的實現(xiàn)

publicabstractvoidHandle();}狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的具體狀態(tài)類代碼:classConcreteState:State{publicoverridevoidHandle(){ //方法具體實現(xiàn)代碼}}狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的環(huán)境類代碼:classContext{privateStatestate;//維持一個對抽象狀態(tài)對象的引用

privateintvalue;//其他屬性值,該屬性值的變化可能會導(dǎo)致對象狀態(tài)發(fā)生變化

//設(shè)置狀態(tài)對象publicvoidSetState(Statestate){ this.state=state;}publicvoidRequest(){ //其他代碼

state.Handle();//調(diào)用狀態(tài)對象的業(yè)務(wù)方法

//其他代碼

}}狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)狀態(tài)轉(zhuǎn)換的實現(xiàn):(1)統(tǒng)一由環(huán)境類來負責(zé)狀態(tài)之間的轉(zhuǎn)換,環(huán)境類充當了狀態(tài)管理器(StateManager)角色……publicvoidChangeState(){//判斷屬性值,根據(jù)屬性值進行狀態(tài)轉(zhuǎn)換if(value==0){ this.SetState(newConcreteStateA());}elseif(value==1){ this.SetState(newConcreteStateB());}......}……狀態(tài)模式狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)狀態(tài)轉(zhuǎn)換的實現(xiàn):(2)由具體狀態(tài)類來負責(zé)狀態(tài)之間的轉(zhuǎn)換,可以在具體狀態(tài)類的業(yè)務(wù)方法中判斷環(huán)境類的某些屬性值,再根據(jù)情況為環(huán)境類設(shè)置新的狀態(tài)對象,實現(xiàn)狀態(tài)轉(zhuǎn)換……publicvoidChangeState(Contextctx){//根據(jù)環(huán)境對象中的屬性值進行狀態(tài)轉(zhuǎn)換if(ctx.Value==1){ ctx.SetState(newConcreteStateB());}elseif(ctx.Value==2){ ctx.SetState(newConcreteStateC());}......}……狀態(tài)模式狀態(tài)模式的應(yīng)用實例實例說明某軟件公司要為一銀行開發(fā)一套信用卡業(yè)務(wù)系統(tǒng),銀行賬戶(Account)是該系統(tǒng)的核心類之一,通過分析,該軟件公司開發(fā)人員發(fā)現(xiàn)在系統(tǒng)中賬戶存在3種狀態(tài),且在不同狀態(tài)下賬戶存在不同的行為,具體說明如下:(1)如果賬戶中余額大于等于0,則賬戶的狀態(tài)為正常狀態(tài)(NormalState),此時用戶既可以向該賬戶存款也可以從該賬戶取款;(2)如果賬戶中余額小于0,并且大于-2000,則賬戶的狀態(tài)為透支狀態(tài)(OverdraftState),此時用戶既可以向該賬戶存款也可以從該賬戶取款,但需要按天計算利息;(3)如果賬戶中余額等于-2000,那么賬戶的狀態(tài)為受限狀態(tài)(RestrictedState),此時用戶只能向該賬戶存款,不能再從中取款,同時也將按天計算利息;(4)根據(jù)余額的不同,以上3種狀態(tài)可發(fā)生相互轉(zhuǎn)換?,F(xiàn)使用狀態(tài)模式設(shè)計并實現(xiàn)銀行賬戶狀態(tài)的轉(zhuǎn)換。狀態(tài)模式狀態(tài)模式的應(yīng)用實例實例分析與類圖銀行賬戶狀態(tài)圖狀態(tài)模式狀態(tài)模式的應(yīng)用實例實例分析與類圖銀行賬戶結(jié)構(gòu)圖狀態(tài)模式狀態(tài)模式狀態(tài)模式實例與解析實例一:論壇用戶等級

在某論壇系統(tǒng)中,用戶可以發(fā)表留言,發(fā)表留言將增加積分;用戶也可以回復(fù)留言,回復(fù)留言也將增加積分;用戶還可以下載文件,下載文件將扣除積分。該系統(tǒng)用戶分為三個等級,分別是新手、高手和專家,這三個等級對應(yīng)三種不同的狀態(tài),這三種狀態(tài)分別定義如下:(1)如果積分小于100分,則為新手狀態(tài),用戶可以發(fā)表留言、回復(fù)留言,但是不能下載文件。如果積分大于等于1000分,則轉(zhuǎn)換為專家狀態(tài);如果積分大于等于100分,則轉(zhuǎn)換為高手狀態(tài)。(2)如果積分大于等于100分但小于1000分,則為高手狀態(tài),用戶可以發(fā)表留言、回復(fù)留言,還可以下載文件,而且用戶在發(fā)表留言時可以獲取雙倍積分。如果積分小于100分,則轉(zhuǎn)換為新手狀態(tài);如果積分大于等于1000分,則轉(zhuǎn)換為專家狀態(tài);如果下載文件后積分小于0,則不能下載該文件。(3)如果積分大于等于1000分,則為專家狀態(tài),用戶可以發(fā)表留言、回復(fù)留言和下載文件,用戶除了在發(fā)表留言時可以獲取雙倍積分外,下載文件只扣除所需積分的一半。如果積分小于100分,則轉(zhuǎn)換為新手狀態(tài);如果積分小于1000分,但大于等于100,則轉(zhuǎn)換為高手狀態(tài);如果下載文件后積分小于0,則不能下載該文件。狀態(tài)模式狀態(tài)模式狀態(tài)模式共享狀態(tài)動機在有些情況下,多個環(huán)境對象可能需要共享同一個狀態(tài)如果希望在系統(tǒng)中實現(xiàn)多個環(huán)境對象共享一個或多個狀態(tài)對象,那么需要將這些狀態(tài)對象定義為環(huán)境類的靜態(tài)成員對象狀態(tài)模式共享狀態(tài)實例某系統(tǒng)要求兩個開關(guān)對象要么都處于開的狀態(tài),要么都處于關(guān)的狀態(tài),在使用時它們的狀態(tài)必須保持一致,開關(guān)可以由開轉(zhuǎn)換到關(guān),也可以由關(guān)轉(zhuǎn)換到開。試使用狀態(tài)模式來實現(xiàn)開關(guān)的設(shè)計。狀態(tài)模式共享狀態(tài)結(jié)構(gòu)開關(guān)及其狀態(tài)設(shè)計結(jié)構(gòu)圖狀態(tài)模式使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換動機對于客戶端而言,無須關(guān)心狀態(tài)類,可以為環(huán)境類設(shè)置默認的狀態(tài)類,將狀態(tài)的轉(zhuǎn)換工作交給環(huán)境類(或具體狀態(tài)類)來完成,具體的轉(zhuǎn)換細節(jié)對于客戶端而言是透明的可以通過環(huán)境類來實現(xiàn)狀態(tài)轉(zhuǎn)換,環(huán)境類作為一個狀態(tài)管理器,統(tǒng)一實現(xiàn)各種狀態(tài)之間的轉(zhuǎn)換操作狀態(tài)模式使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換實例現(xiàn)要開發(fā)一個屏幕放大鏡工具,其具體功能描述如下:用戶單擊“放大鏡”按鈕之后屏幕將放大一倍,再單擊一次“放大鏡”按鈕屏幕再放大一倍,第三次單擊該按鈕后屏幕將還原到默認大小。試使用狀態(tài)模式來設(shè)計該屏幕放大鏡工具。狀態(tài)模式使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換結(jié)構(gòu)屏幕放大鏡工具結(jié)構(gòu)圖狀態(tài)模式狀態(tài)模式的優(yōu)缺點與適用環(huán)境模式優(yōu)點封裝了狀態(tài)的轉(zhuǎn)換規(guī)則,可以對狀態(tài)轉(zhuǎn)換代碼進行集中管理,而不是分散在一個個業(yè)務(wù)方法中將所有與某個狀態(tài)有關(guān)的行為放到一個類中,只需要注入一個不同的狀態(tài)對象即可使環(huán)境對象擁有不同的行為允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體,而不是提供一個巨大的條件語句塊,可以避免使用龐大的條件語句來將業(yè)務(wù)方法和狀態(tài)轉(zhuǎn)換代碼交織在一起可以讓多個環(huán)境對象共享一個狀態(tài)對象,從而減少系統(tǒng)中對象的個數(shù)狀態(tài)模式狀態(tài)模式的優(yōu)缺點與適用環(huán)境模式缺點會增加系統(tǒng)中類和對象的個數(shù),導(dǎo)致系統(tǒng)運行開銷增大結(jié)構(gòu)與實現(xiàn)都較為復(fù)雜,如果使用不當將導(dǎo)致程序結(jié)構(gòu)和代碼混亂,增加系統(tǒng)設(shè)計的難度對開閉原則的支持并不太好,增加新的狀態(tài)類

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論