




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第24章狀態(tài)模式劉 偉weiliu_chinayahoo本章教學(xué)內(nèi)容狀態(tài)模式 模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析 模式實(shí)例與解析 模式效果與應(yīng)用 模式擴(kuò)展?fàn)顟B(tài)模式模式動(dòng)機(jī)在很多情況下,一個(gè)對象的行為取決于一個(gè)或多個(gè)動(dòng)態(tài)變化的屬性,這樣的屬性叫做狀態(tài),這樣的對象叫做有狀態(tài)的 (stateful)對象,這樣的對象狀態(tài)是從事先定義好的一系列值中取出的。當(dāng)一個(gè)這樣的對象與外部事件產(chǎn)生互動(dòng)時(shí),其內(nèi)部狀態(tài)就會(huì)改變,從而使得系統(tǒng)的行為也隨之發(fā)生變化。在UML中可以使用狀態(tài)圖來描述對象狀態(tài)的變化。 狀態(tài)模式模式動(dòng)機(jī)狀態(tài)模式模式定義狀態(tài)模式(State Pattern) :允許一個(gè)對象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為
2、,對象看起來似乎修改了它的類。其別名為狀態(tài)對象(Objects for States),狀態(tài)模式是一種對象行為型模式。狀態(tài)模式模式定義State Pattern: Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. Frequency of use: medium狀態(tài)模式模式結(jié)構(gòu)狀態(tài)模式模式結(jié)構(gòu)狀態(tài)模式包含如下角色:Context: 環(huán)境類State: 抽象狀態(tài)類ConcreteState: 具體狀態(tài)類狀態(tài)模式模式分析
3、狀態(tài)模式描述了對象狀態(tài)的變化以及對象如何在每一種狀態(tài)下表現(xiàn)出不同的行為。狀態(tài)模式的關(guān)鍵是引入了一個(gè)抽象類來專門表示對象的狀態(tài),這個(gè)類我們叫做抽象狀態(tài)類,而對象的每一種具體狀態(tài)類都繼承了該類,并在不同具體狀態(tài)類中實(shí)現(xiàn)了不同狀態(tài)的行為,包括各種狀態(tài)之間的轉(zhuǎn)換。狀態(tài)模式模式分析狀態(tài)模式模式分析不使用狀態(tài)模式:if(state=空閑)if(預(yù)訂房間)預(yù)訂操作;state=已預(yù)訂;else if(住進(jìn)房間)入住操作;state=已入住;else if(state=已預(yù)訂)if(住進(jìn)房間)入住操作;state=已入住;else if(取消預(yù)訂)取消操作;state=空閑; 狀態(tài)模式模式分析狀態(tài)模式模式分析
4、使用狀態(tài)模式重構(gòu)之后的代碼:/重構(gòu)之后的“空閑狀態(tài)類”示例代碼if(預(yù)訂房間)預(yù)訂操作;context.setState(new 已預(yù)訂狀態(tài)類();else if(住進(jìn)房間)入住操作;context.setState(new 已入住狀態(tài)類(); 狀態(tài)模式模式分析在狀態(tài)模式結(jié)構(gòu)中需要理解環(huán)境類與抽象狀態(tài)類的作用:環(huán)境類實(shí)際上就是擁有狀態(tài)的對象,環(huán)境類有時(shí)候可以充當(dāng)狀態(tài)管理器(State Manager)的角色,可以在環(huán)境類中對狀態(tài)進(jìn)行切換操作。抽象狀態(tài)類可以是抽象類,也可以是接口,不同狀態(tài)類就是繼承這個(gè)父類的不同子類,狀態(tài)類的產(chǎn)生是由于環(huán)境類存在多個(gè)狀態(tài),同時(shí)還滿足兩個(gè)條件:這些狀態(tài)經(jīng)常需要切換
5、,在不同的狀態(tài)下對象的行為不同。因此可以將不同對象下的行為單獨(dú)提取出來封裝在具體的狀態(tài)類中,使得環(huán)境類對象在其內(nèi)部狀態(tài)改變時(shí)可以改變它的行為,對象看起來似乎修改了它的類,而實(shí)際上是由于切換到不同的具體狀態(tài)類實(shí)現(xiàn)的。由于環(huán)境類可以設(shè)置為任一具體狀態(tài)類,因此它針對抽象狀態(tài)類進(jìn)行編程,在程序運(yùn)行時(shí)可以將任一具體狀態(tài)類的對象設(shè)置到環(huán)境類中,從而使得環(huán)境類可以改變內(nèi)部狀態(tài),并且改變行為。狀態(tài)模式狀態(tài)模式實(shí)例與解析實(shí)例一:論壇用戶等級 在某論壇系統(tǒng)中,用戶可以發(fā)表留言,發(fā)表留言將增加積分;用戶也可以回復(fù)留言,回復(fù)留言也將增加積分;用戶還可以下載文件,下載文件將扣除積分。該系統(tǒng)用戶分為三個(gè)等級,分別是新手、
6、高手和專家,這三個(gè)等級對應(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ā)表留言時(shí)可以獲取雙倍積分。如果積分小于100分,則轉(zhuǎn)換為新手狀態(tài);如果積分大于等于1000分,則轉(zhuǎn)換為專家狀態(tài);如果下載文件后積分小于0,則不能下載該文件。(3) 如果積分大于等于1000分,則為專家狀態(tài),用戶可以發(fā)表留言、回復(fù)留言和
7、下載文件,用戶除了在發(fā)表留言時(shí)可以獲取雙倍積分外,下載文件只扣除所需積分的一半。如果積分小于100分,則轉(zhuǎn)換為新手狀態(tài);如果積分小于1000分,但大于等于100,則轉(zhuǎn)換為高手狀態(tài);如果下載文件后積分小于0,則不能下載該文件。狀態(tài)模式狀態(tài)模式實(shí)例與解析實(shí)例一:論壇用戶等級 狀態(tài)模式狀態(tài)模式實(shí)例與解析實(shí)例一:論壇用戶等級參考代碼 (Chapter 24 Statesample01)演示狀態(tài)模式狀態(tài)模式實(shí)例與解析實(shí)例二:銀行賬戶 在某銀行系統(tǒng)定義的賬戶有三種狀態(tài):(1) 如果賬戶(Account)中余額(balance)大于等于0,此時(shí)賬戶的狀態(tài)為綠色(GreenState),即正常狀態(tài),表示既可以
8、向該賬戶存款(deposit)也可以從該賬戶取款(withdraw);(2) 如果賬戶中余額小于0,并且大于等于-1000,則賬戶的狀態(tài)為黃色(YellowState),即欠費(fèi)狀態(tài),此時(shí)既可以向該賬戶存款也可以從該賬戶取款;(3) 如果賬戶中余額小于-1000,那么賬戶的狀態(tài)為紅色(RedState),即透支狀態(tài),此時(shí)用戶只能向該賬戶存款,不能再從中取款?,F(xiàn)用狀態(tài)模式來實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)化問題,用戶只需要執(zhí)行簡單的存款和取款操作,系統(tǒng)根據(jù)余額數(shù)量自動(dòng)轉(zhuǎn)換到相應(yīng)的狀態(tài)。狀態(tài)模式狀態(tài)模式實(shí)例與解析實(shí)例二:銀行賬戶 狀態(tài)模式模式優(yōu)缺點(diǎn)狀態(tài)模式的優(yōu)點(diǎn)封裝了轉(zhuǎn)換規(guī)則。 枚舉可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀
9、態(tài)種類。將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為。允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體,而不是某一個(gè)巨大的條件語句塊。可以讓多個(gè)環(huán)境對象共享一個(gè)狀態(tài)對象,從而減少系統(tǒng)中對象的個(gè)數(shù)。狀態(tài)模式模式優(yōu)缺點(diǎn)狀態(tài)模式的缺點(diǎn)狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類和對象的個(gè)數(shù)。狀態(tài)模式的結(jié)構(gòu)與實(shí)現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。狀態(tài)模式對“開閉原則”的支持并不太好,對于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無法切換到新增狀態(tài);而且修改某個(gè)狀態(tài)類的行為也需修改對應(yīng)類的源代碼。狀態(tài)模式模式適用環(huán)境在以
10、下情況下可以使用狀態(tài)模式:對象的行為依賴于它的狀態(tài)(屬性)并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為。代碼中包含大量與對象狀態(tài)有關(guān)的條件語句,這些條件語句的出現(xiàn),會(huì)導(dǎo)致代碼的可維護(hù)性和靈活性變差,不能方便地增加和刪除狀態(tài),使客戶類與類庫之間的耦合增強(qiáng)。在這些條件語句中包含了對象的行為,而且這些條件對應(yīng)于對象的各種狀態(tài)。狀態(tài)模式模式應(yīng)用(1) 狀態(tài)模式在工作流或游戲等類型的軟件中得以廣泛使用,甚至可以用于這些系統(tǒng)的核心功能設(shè)計(jì),如在政府OA辦公系統(tǒng)中,一個(gè)批文的狀態(tài)有多種:尚未辦理;正在辦理;正在批示;正在審核;已經(jīng)完成等各種狀態(tài),而且批文狀態(tài)不同時(shí)對批文的操作也有所差異。使用狀態(tài)模式可以描述工
11、作流對象(如批文)的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下它所具有的行為。 狀態(tài)模式模式應(yīng)用(2) 在目前主流的RPG(Role Play Game,角色扮演游戲)中,使用狀態(tài)模式可以對游戲角色進(jìn)行控制,游戲角色的升級伴隨著其狀態(tài)的變化和行為的變化。對于游戲程序本身也可以通過狀態(tài)模式進(jìn)行總控,一個(gè)游戲活動(dòng)包括開始、運(yùn)行、結(jié)束等狀態(tài),通過對狀態(tài)的控制可以控制系統(tǒng)的行為,決定游戲的各個(gè)方面,因此可以使用狀態(tài)模式對整個(gè)游戲的架構(gòu)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。狀態(tài)模式模式擴(kuò)展共享狀態(tài)在有些情況下多個(gè)環(huán)境對象需要共享同一個(gè)狀態(tài),如果希望在系統(tǒng)中實(shí)現(xiàn)多個(gè)環(huán)境對象實(shí)例共享一個(gè)或多個(gè)狀態(tài)對象,那么需要將這些狀態(tài)對象定義為環(huán)境的靜態(tài)成員對象
12、。參考代碼 (Chapter 24 StateShareState)演示狀態(tài)模式模式擴(kuò)展簡單狀態(tài)模式與可切換狀態(tài)的狀態(tài)模式(1) 簡單狀態(tài)模式:簡單狀態(tài)模式是指狀態(tài)都相互獨(dú)立,狀態(tài)之間無須進(jìn)行轉(zhuǎn)換的狀態(tài)模式,這是最簡單的一種狀態(tài)模式。對于這種狀態(tài)模式,每個(gè)狀態(tài)類都封裝與狀態(tài)相關(guān)的操作,而無須關(guān)心狀態(tài)的切換,可以在客戶端直接實(shí)例化狀態(tài)類,然后將狀態(tài)對象設(shè)置到環(huán)境類中。如果是這種簡單的狀態(tài)模式,它遵循“開閉原則”,在客戶端可以針對抽象狀態(tài)類進(jìn)行編程,而將具體狀態(tài)類寫到配置文件中,同時(shí)增加新的狀態(tài)類對原有系統(tǒng)也不造成任何影響。狀態(tài)模式模式擴(kuò)展簡單狀態(tài)模式與可切換狀態(tài)的狀態(tài)模式(2) 可切換狀態(tài)的狀態(tài)
13、模式:大多數(shù)的狀態(tài)模式都是可以切換狀態(tài)的狀態(tài)模式,在實(shí)現(xiàn)狀態(tài)切換時(shí),在具體狀態(tài)類內(nèi)部需要調(diào)用環(huán)境類Context的setState()方法進(jìn)行狀態(tài)的轉(zhuǎn)換操作,在具體狀態(tài)類中可以調(diào)用到環(huán)境類的方法,因此狀態(tài)類與環(huán)境類之間通常還存在關(guān)聯(lián)關(guān)系或者依賴關(guān)系。通過在狀態(tài)類中引用環(huán)境類的對象來回調(diào)環(huán)境類的setState()方法實(shí)現(xiàn)狀態(tài)的切換。在這種可以切換狀態(tài)的狀態(tài)模式中,增加新的狀態(tài)類可能需要修改其他某些狀態(tài)類甚至環(huán)境類的源代碼,否則系統(tǒng)無法切換到新增狀態(tài)。 本章小結(jié)狀態(tài)模式允許一個(gè)對象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對象看起來似乎修改了它的類。其別名為狀態(tài)對象,狀態(tài)模式是一種對象行為型模式。狀態(tài)模式
14、包含三個(gè)角色:環(huán)境類又稱為上下文類,它是擁有狀態(tài)的對象,在環(huán)境類中維護(hù)一個(gè)抽象狀態(tài)類State的實(shí)例,這個(gè)實(shí)例定義當(dāng)前狀態(tài),在具體實(shí)現(xiàn)時(shí),它是一個(gè)State子類的對象,可以定義初始狀態(tài);抽象狀態(tài)類用于定義一個(gè)接口以封裝與環(huán)境類的一個(gè)特定狀態(tài)相關(guān)的行為;具體狀態(tài)類是抽象狀態(tài)類的子類,每一個(gè)子類實(shí)現(xiàn)一個(gè)與環(huán)境類的一個(gè)狀態(tài)相關(guān)的行為,每一個(gè)具體狀態(tài)類對應(yīng)環(huán)境的一個(gè)具體狀態(tài),不同的具體狀態(tài)類其行為有所不同。狀態(tài)模式描述了對象狀態(tài)的變化以及對象如何在每一種狀態(tài)下表現(xiàn)出不同的行為。本章小結(jié)狀態(tài)模式的主要優(yōu)點(diǎn)在于封裝了轉(zhuǎn)換規(guī)則,并枚舉可能的狀態(tài),它將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為,還可以讓多個(gè)環(huán)境對象共享一個(gè)狀態(tài)對象,從而減少系統(tǒng)中對象的個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高價(jià)電纜出售合同范本
- 在農(nóng)村種地合同范本
- 弱電發(fā)包合同范本
- 托管學(xué)生租賃合同范本
- 房產(chǎn)買賣解約合同范本
- 企業(yè)文化揭秘培訓(xùn)課件
- 2025年采礦區(qū)計(jì)量磅房管理合同
- 2025勞動(dòng)合同案例分析
- 2025實(shí)驗(yàn)室租賃合同范本
- 2025深圳租房合同模板
- 2025年綿陽燃?xì)饧瘓F(tuán)有限公司招聘筆試參考題庫含答案解析
- 2024年4.15全民國家安全教育日知識題庫及答案
- 二零二五年度農(nóng)村電網(wǎng)改造升級供電協(xié)議合同范本3篇
- 農(nóng)業(yè)執(zhí)法業(yè)務(wù)培訓(xùn)課件
- 【MOOC】健康傳播:基礎(chǔ)與應(yīng)用-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 《基于地統(tǒng)計(jì)學(xué)方法的土壤重金屬污染物空間分布及擴(kuò)散特征研究》
- 申能集團(tuán)在線測評題目
- 企業(yè)管理咨詢服務(wù)合同與企業(yè)管理服務(wù)合同
- 中年職業(yè)規(guī)劃
- 中華人民共和國保守國家秘密法實(shí)施條例
- DB41T 2280-2022 路橋用泡沫輕質(zhì)土應(yīng)用技術(shù)規(guī)程
評論
0/150
提交評論