




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、河南理工大學(xué)程序設(shè)計模式結(jié)課論文2012 20013學(xué)年 第 2 學(xué)期論文題目 策略模式 學(xué)生姓名 學(xué) 號 專業(yè)班級 指導(dǎo)教師 年 月 日題目1. Strategy模式概述 摘要:設(shè)計模式是一種高級軟件重用技術(shù),即在軟件開發(fā)過程中,在特定環(huán)境下解決問題的方法。使用設(shè)計模式可以更加簡便的重用成功的設(shè)計和已有的體系結(jié)構(gòu)。本文以一個簡單的例子介紹了策略模式,并給出了策略模式的java實現(xiàn)。 在生活中,我們經(jīng)常需要就執(zhí)行某項任務(wù)或解決某個問題的一般方法做出抉擇,這種情況在軟件開發(fā)中也屢見不鮮,我們大多數(shù)人都已經(jīng)了解到,短期的抄近路,可能會在長期導(dǎo)致問題嚴(yán)重復(fù)雜化, 在軟件開發(fā)中也常常遇到類似的情況,實
2、現(xiàn)某一個功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查找算法,可以將這些算法寫到一個類中,在該類中提供多個方法,每一個方法對應(yīng)一個具體的查找算法;當(dāng)然也可以將這些查找算法封裝在一個統(tǒng)一的方法中,通過ifelse或者case等條件判斷語句來進行選擇。這兩種實現(xiàn)方法我們都可以稱之為硬編碼,如果需要增加一種新的查找算法,需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端調(diào)用代碼。在這個算法類中封裝了大量查找算法,該類代碼將較復(fù)雜,維護較為困難。如果我們將這些
3、策略包含在客戶端,這種做法更不可取,將導(dǎo)致客戶端程序龐大而且難以維護,如果存在大量可供選擇的算法時問題將變得更加嚴(yán)重。2. Strategy模式的定義 策略模式是一種行為模式。定義一系列的算法,把他們一個個封裝起來,并且使他們可以相互替換,并對用戶提供統(tǒng)一的接口,策略模式使算法可獨立于使用它的客戶而變化。(Define a family of algorithms,encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients tha
4、t use it. ) 策略模式把對象本身和運算規(guī)則區(qū)分開來,其功能非常強大,因為這個設(shè)計模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡缘乃枷搿?策略模式的功能:把具體的算法實現(xiàn)從具體的業(yè)務(wù)處理中獨立出來來,把它們實現(xiàn)成單獨的算法類,從而形成一系列的算法,并讓這些算法可以相互替換。 策略模式的重心不是如何實現(xiàn)算法,而是如何組織、調(diào)用這些算法,從而讓程序結(jié)構(gòu)更靈活,具有更好的可維護性和可擴展性策略算法在實現(xiàn)上也是相互獨立的,相互之間相互沒有依賴的。3. Strategy模式的結(jié)構(gòu)和使用 3.1 策略模式的結(jié)構(gòu)ClientStrategyAlgorthminterface()ContextContex
5、tinterfaceStrategyConcreteStrategy CAlgorthminterface()ConcreteStrategy BAlgorthminterface()ConcreteStrategy AAlgorthminterface() 圖:模式的通用結(jié)構(gòu)圖 策略模式的結(jié)構(gòu)圖如上所示:Context定義了一個面向應(yīng)用的接口。它維護對一個Strategy對象的引用,并使用一個ConcreteStrategy 對象來配置本身。Strategy定義所有的的算法的公共接口,Context使用此接口來調(diào)用具體的算法(策略)。具體算法在ConcreteStrategy中實現(xiàn)。這里每一
6、種算法即為一個策略。 當(dāng)客戶調(diào)用Context 時,它將客戶的請求轉(zhuǎn)發(fā)給它的Strategy 。Context將該算法所需的所有數(shù)據(jù)傳遞給Strategy,或者將自身作為參數(shù)傳遞給Strategy ,使 Strategy可以回調(diào)Context 。 ConcreteStrategy實現(xiàn)具體算法。 3.2 Strategy模式以以下幾條原則為基礎(chǔ):(1)對象都具有職責(zé),這些職責(zé)不同的具體實現(xiàn)是通過多態(tài)的使用完成的。(2)概念上相同的算法具有多個不同的實現(xiàn),需要進行管理。 將問題域中的各個行為互相分離開來-也就是說將他們解耦,是一個好的設(shè)計實踐,這使得我們可以修改負(fù)責(zé)某一行為的類,不會對其它的類產(chǎn)生
7、不良影響 3.3 Strategy模式關(guān)鍵特征 A.意圖:可以根據(jù)所處的上下文,使用不同的的業(yè)務(wù)規(guī)則或算法;問題:對所需算法的選擇取決于發(fā)出請求的客戶或者要處理的數(shù)據(jù),如果只有一些不會變化的算法,就不需要 Strategy 模式;B.解決方案:將對算法的選擇和算法的實現(xiàn)相分離。允許根據(jù)上下文進行選擇;C.參與者與寫作者:Strategy 模式制定了如何使用不同的算法,各ConcreteStrategy實現(xiàn)了這些不同個算法,Context 通過類型Strategy的引用時用具體的ConcreteStrategy,Strategy與Contextx相互作用以實現(xiàn)所選的算法,Context將均來自C
8、ontext的請求轉(zhuǎn)發(fā)給Strategy。D.效果:Strategy 模式定義了一些列的算法;可以不使用Switch語句或條件語句;必須以相同的方法調(diào)用所有的算法,(他們之間必須擁有相同的接口),各ConcreteStrategy與Context中加入獲取狀態(tài)的方法.E.實現(xiàn):讓使用算法的類(Context)包含一個抽象類(Strategy),該抽象類由一個抽象方法制定如何讓調(diào)用算法,每個派生類按需要實現(xiàn)算法。 注意:在原型Strategy模式中,選擇所有具體實現(xiàn)的職責(zé)由Context對象承擔(dān),并轉(zhuǎn)給Strategy模式的Context對象 3.4 Strategy模式的組成 環(huán)境類(Cont
9、ext):用一個ConcreteStrategy對象來配置。維護一個對Strategy對象的引用??啥x一個接口來讓Strategy訪問它的數(shù)據(jù)。 抽象策略類(Strategy):定義所有支持的算法的公共接口。 Context使用這個接口來調(diào)用某ConcreteStrategy定義的算法。 具體策略類 (ConcreteStrategy ):Strategy接口實現(xiàn)某具體算法。4. Strategy模式的優(yōu)點1) 相關(guān)算法系列 Strategy類層次為Context定義了一系列的可供重用的算法或行為。 繼承有助于析取出這些算法中的公共功能。2) 提供了可以替換繼承關(guān)系的辦法: 繼承提供了另一種
10、支持多種算法或行為的方法。你可以直接生成一個Context類的子類,從而給它以不同的行為。但這會將行為硬行編制到 Context中,而將算法的實現(xiàn)與Context的實現(xiàn)混合起來,從而使Context難以理解、難以維護和難以擴展,而且還不能動態(tài)地改變算法。最后你得到一堆相關(guān)的類 , 它們之間的唯一差別是它們所使用的算法或行為。 將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展。3) 消除了一些if else條件語句 :Strategy模式提供了用條件語句選擇所需的行為以外的另一種選擇。當(dāng)不同的行為堆砌在一個類中時 ,很難避免使用條件語
11、句來選擇合適的行為。將行為封裝在一個個獨立的Strategy類中消除了這些條件語句。含有許多條件語句的代碼通常意味著需要使用Strategy模式。4) 實現(xiàn)的選擇 Strategy模式可以提供相同行為的不同實現(xiàn)。客戶可以根據(jù)不同時間 /空間權(quán)衡取舍要求從不同策略中進行選擇。5. 適合使用策略模式的情景 在下述情況下可以使用策略模式。(1) 許多相關(guān)的類僅僅是行為有異?!安呗浴碧峁┝艘环N用多個行為中的一個行為來配置一個類的方法。(2) 需要使用一個算法的不同變體。當(dāng)這些變體實現(xiàn)為一個算法的類層次時,可以使用策略模式。(3) 算法使用客戶不應(yīng)該知道的數(shù)據(jù)??墒褂貌呗阅J揭员苊獗┞稄?fù)雜的,與算法相關(guān)
12、的數(shù)據(jù)結(jié)構(gòu)。(4) 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn)。將相關(guān)的條件分支一如它們各自的Strategy類中以代替這些條件語句。6. Strategy模式在Java中的應(yīng)用 在我們的日常生活中,經(jīng)常遇到這樣的事情:同一件事情在不同的情況下或針對不同的對象會有不同的做法。用程序設(shè)計術(shù)語來說就是:同樣的接口,在不同的情況下需要使用不同的算法。而我們現(xiàn)在所要說的策略模式就是能夠?qū)崿F(xiàn)這一功能的一種設(shè)計模式,它可以在不影響客戶端的情況下進行多個算法的替換。 例如,我們在一家餐廳吃飯,針對套餐,不同年齡的人可能收費不一樣,大人如父母40元每份,老人20元每份,小孩子1
13、0元每份。如果要設(shè)計個軟件來做這件事,那么通常首先考慮的是使用ifelse或switch之類的結(jié)構(gòu)來解決這個問題,例如如下代碼:(代碼不能運行,僅僅說明問題)javaview plaincopyprint?1. publicclassClient2. 3. publicstaticvoidmain(Stringarg)4. showPrice(persontypeType);5. 6. 7. 8. publicstaticvoidshowPrice(persontypepersontypeType)9. if(persontypeType.equals(daren)/大人10. System.
14、out.println(每份40);11. else12. if(persontypeType.equals(laoren)/老人13. System.out.println(每份20);14. else15. if(persontypeType.equals(xiaihai)/小孩子System.out.println(每份10);16. 17. 18. 19. 仔細(xì)分析一下就會知道,這個程序的可變性代碼就是3個算法,因此可以先把這3個算法分別用3個類封裝起來。由于算法就放在客戶端,所以一旦某個計算方法發(fā)生變化,顯然它違背了開-閉原則,沒有把可變性代碼進行封裝,所以這不是個好程序。Charg
15、eType是抽象類,客戶面對的是抽象角色,而真正算法的實現(xiàn)是抽象角色的子類。也就是說,可變的算法已經(jīng)與客戶實現(xiàn)了隔離,從而提高了程序的可維護性。程序源代碼:(異常簡單,僅僅說明問題)javaview plaincopyprint?1. publicabstractclassChargeType2. publicabstractvoidchargeInfo();3. 4. 5. 6. 7. publicclassdarenChargeextendsChargeType8. 9. Override10. publicvoidchargeInfo()11. System.out.println(每份
16、40元);/算法代碼12. 13. 14. 15. 16. 17. 18. 19. publicclasslaorenChargeextendsChargeType20. 21. Override22. publicvoidchargeInfo()23. System.out.println(每份20元);24. 25. 26. 27. 28. 29. 30. 31. publicclassxiaohaiChargeextendsChargeType32. 33. Override34. publicvoidchargeInfo()35. System.out.println(每份10元);3
17、6. 37. 38. 39. 40. 7.綜合應(yīng)用舉例 在新的案例研究中,我們來考慮一個美國某國際電子商務(wù)公司的訂單處理系統(tǒng),這個系統(tǒng)必須能夠處理許多不同個國家的訂單,這個系統(tǒng)構(gòu)架中有一個控制器對象,用于處理銷售請求,它能夠確認(rèn)何時有人請求銷售訂單,并將該請求轉(zhuǎn)發(fā)給Salesorder對象進行訂單處理,訂單體系結(jié)構(gòu)系統(tǒng)大致如圖:TaskController-SalesOrder其中:SalesOrder對象的功能包括:允許客戶通過GUI填寫訂單:處理稅額的計算;處理訂單,打印銷售收據(jù); 有些功能可能需要借助其他對象實現(xiàn),比如,SalesOrder對象沒有必要自己打印,它的作用是充當(dāng)一個存放銷售
18、訂單信息的容器,具體的SalesOrder對象可以調(diào)用SalesTicket對象來打印。 根據(jù)這種方法,應(yīng)該這樣做:尋找變化,并將它封裝在一個單獨的類中;將這個類包含在另一個類中; 在本例中,已經(jīng)確定繳稅規(guī)則是變化的,“將它封裝”就意味著創(chuàng)建一個抽象類定義如何在概念上完成稅額計算,然后每種變化派生具體的類,也就是說可以創(chuàng)建一個CalcTax對象,為完成稅額計算這一任務(wù)定義接口,然后由他派生所需的特定版本。CalcTax+taxAmount(in itemSold:Salable,in qty:double, in price :double):doubleCanTaxUSTax 接下來,應(yīng)該使
19、用組合取代繼承,這意味著用不著在創(chuàng)建不同版本的銷售訂單,(使用繼承),可以用組合來包含變化,也就是說,只有一個SalasOrder類,讓它包含處理變化的CalcTax類,如圖TskControllerSalesOrdeer+calcTax()CalcTax+taxAmount(in itemSold:Salable,in qty:double, in price :double):doubleCanTaxUSTax Java代碼片段:實現(xiàn)Strategy模式 模式Public class TaskController Public void process() /這里的代碼模擬了處理任務(wù)控制器
20、/、/取得所在國的信息CalcTax myTax;myTax = getTaxRulesForCountry();SalasOrder mySO = new SalesOrder();mySO.process (myTax);Private CalcTax getTaxRulesForCountry()/在實際開發(fā)中,要去的所在國的計稅規(guī)則/相應(yīng)邏輯可以寫在這里,也可以放到配置文件中/這里返回USTax就可以編譯了Return new USTax();Public calss SalesOrder Public void process (CalcTax taxToUse)Long itemNumber = 0;Double price = 0;/創(chuàng)建計稅對象/、/計算稅額Double tax = taxToUse.taxAmount( itemNumber,price);Public abstract calss CalcTaxAbstract public double taxAmount(Long itemSold,double price);P
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出口寵物食品合同范本
- 倉庫租賃 配送合同范本
- 主力商家合同范本
- 2025年超大型特厚板軋機項目建議書
- 第六課 友誼之樹常青 教學(xué)設(shè)計-2024-2025學(xué)年統(tǒng)編版道德與法治七年級上冊
- 包裝買賣合同范本
- 北京合伙合同范本咨詢
- 《認(rèn)識面積》(教學(xué)設(shè)計)-2023-2024學(xué)年三年級下冊數(shù)學(xué)人教版
- 信用擔(dān)保借款合同范本你
- 制造珠寶生產(chǎn)訂單合同范本
- DLT5461-2013 火力發(fā)電廠施工圖設(shè)計文件深度規(guī)定(第1-16部分)
- DL∕T 1084-2021 風(fēng)力發(fā)電場噪聲限值及測量方法
- DL∕T 478-2013 繼電保護和安全自動裝置通 用技術(shù)條件 正式版
- AQ/T 2036-2011 金屬非金屬地下礦山通信聯(lián)絡(luò)系統(tǒng)建設(shè)規(guī)范 (正式版)
- NB-T33004-2013電動汽車充換電設(shè)施工程施工和竣工驗收規(guī)范
- 2024年云南省中考語文真題版,含答案
- DZ∕T 0399-2022 礦山資源儲量管理規(guī)范(正式版)
- 2024年鄂爾多斯市國資產(chǎn)投資控股集團限公司招聘公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 競賽試卷(試題)-2023-2024學(xué)年六年級下冊數(shù)學(xué)人教版
- 幼兒園強制報告制度培訓(xùn)
- 《研學(xué)旅行課程設(shè)計》課件-辨識與研學(xué)旅行場混淆的概念
評論
0/150
提交評論