設(shè)計模式-狀態(tài)模式_第1頁
設(shè)計模式-狀態(tài)模式_第2頁
設(shè)計模式-狀態(tài)模式_第3頁
設(shè)計模式-狀態(tài)模式_第4頁
設(shè)計模式-狀態(tài)模式_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(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)模式概述H2O的三種狀態(tài)(未考慮臨界點)狀態(tài)模式概述分析在軟件系統(tǒng)中:有些對象具有多種狀態(tài)這些狀態(tài)在某些情況下能夠相互轉(zhuǎn)換對象在不同的狀態(tài)下將具有不同的行為復雜的條件判斷語句來進行狀態(tài)的判斷和轉(zhuǎn)換操作

導致代碼的可維護性和靈活性下降

出現(xiàn)新的狀態(tài)時,代碼的擴展性很差,客戶端代碼也需要進行相應(yīng)的修改,違背了開閉原則classTestXYZ

{

int

behaviour;//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)模式:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它的類。StatePattern:Allowanobjecttoalteritsbehaviorwhenitsinternalstatechanges.Theobjectwillappeartochangeitsclass.狀態(tài)模式概述狀態(tài)模式的定義又名狀態(tài)對象(ObjectsforStates)用于解決系統(tǒng)中復雜對象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問題將一個對象的狀態(tài)從該對象中分離出來,封裝到專門的狀態(tài)類中,使得對象狀態(tài)可以靈活變化對于客戶端而言,無須關(guān)心對象狀態(tài)的轉(zhuǎn)換以及對象所處的當前狀態(tài),無論對于何種狀態(tài)的對象,客戶端都可以一致處理狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的結(jié)構(gòu)狀態(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)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的抽象狀態(tài)類代碼:abstractclassState{//聲明抽象業(yè)務(wù)方法,不同的具體狀態(tài)類可以有不同的實現(xiàn)

publicabstractvoidHandle();}狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的具體狀態(tài)類代碼:classConcreteState:State{

publicoverridevoidHandle(){

//方法具體實現(xiàn)代碼

}}狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)典型的環(huán)境類代碼:classContext{

privateStatestate;//維持一個對抽象狀態(tài)對象的引用

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

//設(shè)置狀態(tài)對象

publicvoidSetState(Statestate){

this.state

=state;

}

publicvoidRequest(){

//其他代碼

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

//其他代碼

}}狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)狀態(tài)轉(zhuǎn)換的實現(xiàn):(1)統(tǒng)一由環(huán)境類來負責狀態(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)模式的結(jié)構(gòu)與實現(xiàn)狀態(tài)模式的實現(xiàn)狀態(tài)轉(zhuǎn)換的實現(xiàn):(2)由具體狀態(tài)類來負責狀態(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)模式的應(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)換。現(xiàn)使用狀態(tài)模式設(shè)計并實現(xiàn)銀行賬戶狀態(tài)的轉(zhuǎn)換。狀態(tài)模式的應(yīng)用實例實例分析與類圖銀行賬戶狀態(tài)圖狀態(tài)模式的應(yīng)用實例實例分析與類圖銀行賬戶結(jié)構(gòu)圖狀態(tài)模式的應(yīng)用實例實例代碼(1)Account:銀行賬戶,充當環(huán)境類(2)AccountState:賬戶狀態(tài)類,充當抽象狀態(tài)類(3)NormalState:正常狀態(tài)類,充當具體狀態(tài)類(4)OverdraftState:透支狀態(tài)類,充當具體狀態(tài)類(5)RestrictedState:受限狀態(tài)類,充當具體狀態(tài)類(6)Program:客戶端測試類演示……參考代碼(DesignPattern\StateSample)狀態(tài)模式的應(yīng)用實例結(jié)果及分析3次取款操作有不同的結(jié)果共享狀態(tài)動機在有些情況下,多個環(huán)境對象可能需要共享同一個狀態(tài)如果希望在系統(tǒng)中實現(xiàn)多個環(huán)境對象共享一個或多個狀態(tài)對象,那么需要將這些狀態(tài)對象定義為環(huán)境類的靜態(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)結(jié)構(gòu)開關(guān)及其狀態(tài)設(shè)計結(jié)構(gòu)圖共享狀態(tài)實現(xiàn)開關(guān)類:Switch(環(huán)境類)抽象狀態(tài)類:SwitchState打開狀態(tài)類:OnState(具體狀態(tài)類)關(guān)閉狀態(tài)類:OffState(具體狀態(tài)類)客戶端測試類:Program演示……參考代碼(DesignPattern\SwitchStateSample)使用環(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)換操作使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換實例現(xiàn)要開發(fā)一個屏幕放大鏡工具,其具體功能描述如下:用戶單擊“放大鏡”按鈕之后屏幕將放大一倍,再單擊一次“放大鏡”按鈕屏幕再放大一倍,第三次單擊該按鈕后屏幕將還原到默認大小。試使用狀態(tài)模式來設(shè)計該屏幕放大鏡工具。使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換結(jié)構(gòu)屏幕放大鏡工具結(jié)構(gòu)圖使用環(huán)境類實現(xiàn)狀態(tài)轉(zhuǎn)換實現(xiàn)屏幕類:Screen(環(huán)境類)抽象狀態(tài)類:ScreenState正常狀態(tài)類:NormalState(具體狀態(tài)類)二倍狀態(tài)類:LargerState(具體狀態(tài)類)四倍狀態(tài)類:LargestState(具體狀態(tài)類)客戶端測試類:Program演示……參考代碼(DesignPattern\ScreenStateSample)狀態(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)模式的優(yōu)缺點與適用環(huán)境模式缺點會增加系統(tǒng)中類和對象的個數(shù),導致系統(tǒng)運行開銷增大結(jié)構(gòu)與實現(xiàn)都較為復雜,如果使用不當將導致程序結(jié)構(gòu)和代碼混亂,增加系統(tǒng)

溫馨提示

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

評論

0/150

提交評論