《設(shè)計(jì)模式》第25章:策略模式_第1頁(yè)
《設(shè)計(jì)模式》第25章:策略模式_第2頁(yè)
《設(shè)計(jì)模式》第25章:策略模式_第3頁(yè)
《設(shè)計(jì)模式》第25章:策略模式_第4頁(yè)
《設(shè)計(jì)模式》第25章:策略模式_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第25章策略模式本章教學(xué)內(nèi)容策略模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展策略模式模式動(dòng)機(jī)完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱為一個(gè)策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來(lái)完成該項(xiàng)任務(wù)。在軟件開(kāi)發(fā)中也常常遇到類似的情況,實(shí)現(xiàn)某一個(gè)功能有多個(gè)途徑,此時(shí)可以使用一種設(shè)計(jì)模式來(lái)使得系統(tǒng)可以靈活地選擇解決途徑,也能夠方便地增加新的解決途徑。策略模式模式動(dòng)機(jī)策略模式模式動(dòng)機(jī)在軟件系統(tǒng)中,有許多算法可以實(shí)現(xiàn)某一功能,如查找、排序等,一種常用的方法是硬編碼(HardCoding)在一個(gè)類中,如需要提供多種查找算法,可以將這些算法寫到一個(gè)類中,在該類中提供多個(gè)方法,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的查找算法;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過(guò)if…else…等條件判斷語(yǔ)句來(lái)進(jìn)行選擇。這兩種實(shí)現(xiàn)方法我們都可以稱之為硬編碼,如果需要增加一種新的查找算法,需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端調(diào)用代碼。在這個(gè)算法類中封裝了大量查找算法,該類代碼將較復(fù)雜,維護(hù)較為困難。策略模式模式動(dòng)機(jī)除了提供專門的查找算法類之外,還可以在客戶端程序中直接包含算法代碼,這種做法更不可取,將導(dǎo)致客戶端程序龐大而且難以維護(hù),如果存在大量可供選擇的算法時(shí)問(wèn)題將變得更加嚴(yán)重。為了解決這些問(wèn)題,可以定義一些獨(dú)立的類來(lái)封裝不同的算法,每一個(gè)類封裝一個(gè)具體的算法,在這里,每一個(gè)封裝算法的類我們都可以稱之為策略(Strategy),為了保證這些策略的一致性,一般會(huì)用一個(gè)抽象的策略類來(lái)做算法的定義,而具體每種算法則對(duì)應(yīng)于一個(gè)具體策略類。策略模式模式定義策略模式(StrategyPattern):定義一系列算法,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化,也稱為政策模式(Policy)。策略模式是一種對(duì)象行為型模式。策略模式模式定義StrategyPattern:Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.Strategyletsthealgorithmvaryindependentlyfromclientsthatuseit.Frequencyofuse:mediumhigh策略模式模式結(jié)構(gòu)策略模式模式結(jié)構(gòu)策略模式包含如下角色:Context:環(huán)境類Strategy:抽象策略類ConcreteStrategy:具體策略類策略模式模式分析策略模式是一個(gè)比較容易理解和使用的設(shè)計(jì)模式,策略模式是對(duì)算法的封裝,它把算法的責(zé)任和算法本身分割開(kāi),委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。用一句話來(lái)說(shuō),就是“準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來(lái),使得它們可以互換”。策略模式模式分析不使用策略模式的代碼:publicclassContext{……publicvoidalgorithm(Stringtype){......if(type=="strategyA"){//算法A}elseif(type=="strategyB"){//算法B}elseif(type=="strategyC"){//算法C}......}……}策略模式模式分析重構(gòu)之后的抽象策略類:publicabstractclassAbstractStrategy{publicabstractvoidalgorithm();}策略模式模式分析重構(gòu)之后的具體策略類:publicclassConcreteStrategyAextendsAbstractStrategy{publicvoidalgorithm(){//算法A}}策略模式模式分析重構(gòu)之后的環(huán)境類:publicclassContext{privateAbstractStrategystrategy;publicvoidsetStrategy(AbstractStrategystrategy){

this.strategy=strategy;}publicvoidalgorithm(){

strategy.algorithm();}}策略模式模式分析客戶端代碼片段:……Contextcontext=newContext();AbstractStrategystrategy;strategy=newConcreteStrategyA();context.setStrategy(strategy);context.algorithm();……

策略模式模式分析在策略模式中,應(yīng)當(dāng)由客戶端自己決定在什么情況下使用什么具體策略角色。策略模式僅僅封裝算法,提供新算法插入到已有系統(tǒng)中,以及老算法從系統(tǒng)中“退休”的方便,策略模式并不決定在何時(shí)使用何種算法,算法的選擇由客戶端來(lái)決定。這在一定程度上提高了系統(tǒng)的靈活性,但是客戶端需要理解所有具體策略類之間的區(qū)別,以便選擇合適的算法,這也是策略模式的缺點(diǎn)之一,在一定程度上增加了客戶端的使用難度。策略模式策略模式實(shí)例與解析實(shí)例一:排序策略某系統(tǒng)提供了一個(gè)用于對(duì)數(shù)組數(shù)據(jù)進(jìn)行操作的類,該類封裝了對(duì)數(shù)組的常見(jiàn)操作,如查找數(shù)組元素、對(duì)數(shù)組元素進(jìn)行排序等?,F(xiàn)以排序操作為例,使用策略模式設(shè)計(jì)該數(shù)組操作類,使得客戶端可以動(dòng)態(tài)地更換排序算法,可以根據(jù)需要選擇冒泡排序或選擇排序或插入排序,也能夠靈活地增加新的排序算法。策略模式策略模式實(shí)例與解析實(shí)例一:排序策略策略模式策略模式實(shí)例與解析實(shí)例一:排序策略參考代碼(Chapter25Strategy\sample01)演示……策略模式策略模式實(shí)例與解析實(shí)例二:旅游出行策略旅游出行方式可以有多種,如可以乘坐飛機(jī)旅游,也可以乘火車旅游,如果有興趣自行車游也是一種極具樂(lè)趣的出行方式。不同的旅游出行方式有不同的實(shí)現(xiàn)過(guò)程,客戶根據(jù)自己的需要選擇一種合適的旅游方式。在本實(shí)例中我們用策略模式來(lái)模擬這一過(guò)程。策略模式策略模式實(shí)例與解析實(shí)例二:旅游出行策略策略模式模式優(yōu)缺點(diǎn)策略模式的優(yōu)點(diǎn)策略模式提供了對(duì)“開(kāi)閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地增加新的算法或行為。策略模式提供了管理相關(guān)的算法族的辦法。策略模式提供了可以替換繼承關(guān)系的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。策略模式模式優(yōu)缺點(diǎn)策略模式的缺點(diǎn)客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。策略模式將造成產(chǎn)生很多策略類,可以通過(guò)使用享元模式在一定程度上減少對(duì)象的數(shù)量。策略模式模式適用環(huán)境在以下情況下可以使用策略模式:如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。不希望客戶端知道復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),在具體策略類中封裝算法和相關(guān)的數(shù)據(jù)結(jié)構(gòu),提高算法的保密性與安全性。策略模式模式應(yīng)用(1)JavaSE的容器布局管理就是策略模式應(yīng)用的一個(gè)經(jīng)典實(shí)例。策略模式模式應(yīng)用(2)在微軟公司提供的演示項(xiàng)目PetShop4.0中使用策略模式來(lái)處理同步訂單和異步訂單的問(wèn)題。在Petshop4.0的BLL子項(xiàng)目中有一個(gè)OrderAsynchronous類和一個(gè)OrderSynchronous類,它們都繼承自IOrderStrategy。OrderSynchronous以一種同步的方式處理訂單,而OrderAsynchronous先將訂單放在隊(duì)列里,然后再對(duì)隊(duì)列里的訂單進(jìn)行處理,以一種異步方式對(duì)訂單進(jìn)行處理。而在BLL中的Order類里通過(guò)反射機(jī)制從配置文件中讀取策略配置的信息以決定到底是使用哪種訂單處理方式。只需要修改配置文件即可更改訂單處理方式,提高了系統(tǒng)的靈活性。策略模式模式擴(kuò)展策略模式與狀態(tài)模式可以通過(guò)環(huán)境類狀態(tài)的個(gè)數(shù)來(lái)決定是使用策略模式還是狀態(tài)模式。策略模式的環(huán)境類自己選擇一個(gè)具體策略類,具體策略類無(wú)須關(guān)心環(huán)境類;而狀態(tài)模式的環(huán)境類由于外在因素需要放進(jìn)一個(gè)具體狀態(tài)中,以便通過(guò)其方法實(shí)現(xiàn)狀態(tài)的切換,因此環(huán)境類和狀態(tài)類之間存在一種雙向的關(guān)聯(lián)關(guān)系。使用策略模式時(shí),客戶端需要知道所選的具體策略是哪一個(gè),而使用狀態(tài)模式時(shí),客戶端無(wú)須關(guān)心具體狀態(tài),環(huán)境類的狀態(tài)會(huì)根據(jù)用戶的操作自動(dòng)轉(zhuǎn)換。如果系統(tǒng)中某個(gè)類的對(duì)象存在多種狀態(tài),不同狀態(tài)下行為有差異,而且這些狀態(tài)之間可以發(fā)生轉(zhuǎn)換時(shí)使用狀態(tài)模式;如果系統(tǒng)中某個(gè)類的某一行為存在多種實(shí)現(xiàn)方式,而且這些實(shí)現(xiàn)方式可以互換時(shí)使用策略模式。本章小結(jié)在策略模式中定義了一系列算法,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化,也稱為政策模式。策略模式是一種對(duì)象行為型模式。策略模式包含三個(gè)角色:環(huán)境類在解決某個(gè)問(wèn)題時(shí)可以采用多種策略,在環(huán)境類中維護(hù)一個(gè)對(duì)抽象策略類的引用實(shí)例;抽象策略類為所支持的算法聲明了抽象方法,是所有策略類的父類;具體策略類實(shí)現(xiàn)了在抽象策略類中定義的算法。策略模式是對(duì)算法的封裝,它把算法的責(zé)任和算法本身分割開(kāi),委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。本章小結(jié)策略模式主要優(yōu)點(diǎn)在于對(duì)“開(kāi)閉原則”的完美支持,在不修改原有系統(tǒng)的基礎(chǔ)上可以更換算法或者增加新的算法,它很好地

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論