軟件體系結(jié)構(gòu)與設(shè)計模式 第七章策略模式_第1頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第七章策略模式_第2頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第七章策略模式_第3頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第七章策略模式_第4頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第七章策略模式_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編輯課件第七章第七章 策略模式策略模式 3/11/20221策略模式(別名:政策)策略模式(別名:政策) 定義一系列算法,把它們一個個封裝起來,并且使它們定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變可相互替換。本模式使得算法可獨立于使用它的客戶而變化。化。Strategy Pattern(Another Name: Policy) Define a family of algorithms, encapsulate each one, and make them inter changeable. Strategy lets the alg

2、orithm vary independently from clients that use it. 編輯課件編輯課件一一 、 概述概述 3/11/20223 策略模式是處理算法的不同變體的一種成熟模策略模式是處理算法的不同變體的一種成熟模式,策略模式通過接口或抽象類封裝算法的標識,式,策略模式通過接口或抽象類封裝算法的標識,即在接口中定義一個抽象方法,實現(xiàn)該接口的類即在接口中定義一個抽象方法,實現(xiàn)該接口的類將實現(xiàn)接口中的抽象方法。將實現(xiàn)接口中的抽象方法。 在策略模式中,封裝算法標識的接口稱作策略,在策略模式中,封裝算法標識的接口稱作策略,實現(xiàn)該接口的類稱作具體策略。實現(xiàn)該接口的類稱作具體策

3、略。 編輯課件二、二、策略模式的結(jié)構(gòu)與使用策略模式的結(jié)構(gòu)與使用 3/11/20224策略模式的結(jié)構(gòu)中包括三種角色:策略模式的結(jié)構(gòu)中包括三種角色: 策略(策略(StrategyStrategy) 具體策略(具體策略(ConcreteStrategyConcreteStrategy) 上下文(上下文(ContextContext) 編輯課件3/11/20225策略模式的策略模式的UMLUML類圖類圖 編輯課件編輯課件編輯課件商品利益存款利息計算利息計算預(yù)想利息方式計算確定余款方式計算利益利息計算.計算編輯課件3/11/20229策略模式的結(jié)構(gòu)的描述與使用策略模式的結(jié)構(gòu)的描述與使用 在某種比賽中有若

4、干個裁判,每位裁判給選手一個得分。選手的最后得分是根據(jù)全體裁判的得分計算出來的。請給出幾種計算選手得分的評分方案,對于某次比賽,可以從你的方案中選擇一種方案作為本次比賽的評分方案。編輯課件 1策略(策略(Strategy) : Computable.java public interface ComputableStrategypublic interface ComputableStrategy public abstract double computeScore(double a); public abstract double computeScore(double a); 編輯課件3

5、/11/2022112 2具體策略(具體策略(ConcreteStrategyConcreteStrategy): : StrategyOne.java StrategyOne.java (代數(shù)平均值方法)(代數(shù)平均值方法)public class StrategyOne implements ComputableStrategypublic class StrategyOne implements ComputableStrategy public double computeScore(double a) public double computeScore(double a) doubl

6、e score=0,sum=0; double score=0,sum=0; for(int i=0;ia.length;i+) for(int i=0;ia.length;i+) sum=sum+ai; sum=sum+ai; score=sum/a.length; score=sum/a.length; return score; return score; 編輯課件3/11/2022122 2具體策略(具體策略(ConcreteStrategyConcreteStrategy): : StrategyTwo.java StrategyTwo.java ( (去掉最大值和最小值,然后計算代

7、數(shù)平均值去掉最大值和最小值,然后計算代數(shù)平均值) )import java.util.Arrays;import java.util.Arrays;public class StrategyTwo implements ComputableStrategypublic class StrategyTwo implements ComputableStrategy public double computeScore(double a) public double computeScore(double a) if(a.length=2) if(a.length=2) return 0; ret

8、urn 0; double score=0,sum=0; double score=0,sum=0; Arrays.sort(a); Arrays.sort(a); for(int i=1;ia.length-1;i+) for(int i=1;ia.length-1;i+) sum=sum+ai; sum=sum+ai; score=sum/(a.length-2); score=sum/(a.length-2); return score; return score; 編輯課件3/11/2022133 3上下文:上下文: GymnasticsGame.java GymnasticsGame

9、.java public class GymnasticsGamepublic class GymnasticsGame ComputableStrategy strategy; ComputableStrategy strategy; public void setStrategy(ComputableStrategy strategy) public void setStrategy(ComputableStrategy strategy) this.strategy=strategy; this.strategy=strategy; public double getPersonScor

10、e(double a) public double getPersonScore(double a) if(strategy!=null) if(strategy!=null) return puteScore(a); return puteScore(a); else else return 0; return 0; 編輯課件3/11/2022144 4應(yīng)用:應(yīng)用: Application.java_1Application.java_1 public class Applicationpublic class Application public static void main(Stri

11、ng args) public static void main(String args) GymnasticsGame game=new GymnasticsGame(); GymnasticsGame game=new GymnasticsGame(); game.setStrategy(new StrategyOne(); game.setStrategy(new StrategyOne(); Person zhang=new Person(); Person zhang=new Person(); zhang.setName( zhang.setName(張三張三);); double

12、 a=9.12,9.25,8.87,9.99,6.99,7.88; double a=9.12,9.25,8.87,9.99,6.99,7.88; Person li=new Person(); Person li=new Person(); li.setName( li.setName(李四李四);); double b=9.15,9.26,8.97,9.89,6.97,7.89; double b=9.15,9.26,8.97,9.89,6.97,7.89; zhang.setScore(game.getPersonScore(a); zhang.setScore(game.getPers

13、onScore(a); li.setScore(game.getPersonScore(b); li.setScore(game.getPersonScore(b); System.out.println( System.out.println(使用算術(shù)平均值方案使用算術(shù)平均值方案:);:); System.out.println( System.out.println(得分得分:,zhang.getName(),zhang.getScore();:,zhang.getName(),zhang.getScore(); System.out.println( System.out.println

14、(得分得分:%5.3f%n,li.getName(),li.getScore();:%5.3f%n,li.getName(),li.getScore();編輯課件3/11/2022154 4應(yīng)用:應(yīng)用: Application.java_2Application.java_2class Personclass Person String name; String name; double score; double score; public void setScore(double t) public void setScore(double t) score=t; score=t; pub

15、lic void setName(String s) public void setName(String s) name=s; name=s; public double getScore() public double getScore() return score; return score; public String getName() public String getName() return name; return name; 編輯課件三、三、策略模式的優(yōu)點策略模式的優(yōu)點 3/11/202216 上下文(上下文(ContextContext)和具體策略)和具體策略(Concr

16、eteStrategyConcreteStrategy)是松耦合關(guān)系。因此上下)是松耦合關(guān)系。因此上下文只知道它要使用某一個實現(xiàn)文只知道它要使用某一個實現(xiàn)StrategyStrategy接口類的接口類的實例,但不需要知道具體是哪一個類。實例,但不需要知道具體是哪一個類。 策略模式滿足策略模式滿足“開開- -閉原則閉原則”。當增加新的具。當增加新的具體策略時,不需要修改上下文類的代碼,上下文體策略時,不需要修改上下文類的代碼,上下文就可以引用新的具體策略的實例。就可以引用新的具體策略的實例。編輯課件四、適合使用策略模式的情景 一個類定義了多種行為,并且這些行為在這個類中以多個條件語句的形式出現(xiàn),

17、可以使用策略模式避免在類中使用大量的條件語句。 程序不需要暴露復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),可以使用策略模式封裝算法。 需要使用一個算法的不同變體。編輯課件五、例二 把數(shù)組導(dǎo)出為表格的算法,輸入一個數(shù)組,導(dǎo)出一個表格,把數(shù)組導(dǎo)出為表格的算法,輸入一個數(shù)組,導(dǎo)出一個表格,當用戶想改變導(dǎo)出的表格時,便可以通過改變輸出的算法當用戶想改變導(dǎo)出的表格時,便可以通過改變輸出的算法改變輸出的結(jié)果。如果輸出的內(nèi)容用以網(wǎng)頁顯示,則輸出改變輸出的結(jié)果。如果輸出的內(nèi)容用以網(wǎng)頁顯示,則輸出 JackMayaMikesShadow 如果輸出的結(jié)果用以直接的屏幕輸出,則可以輸出:如果輸出的結(jié)果用以直接的屏幕輸出,則可以輸

18、出: +-+-+-+-+ |Jack|Maya|Mikes|Shadow| +-+-+-+-+編輯課件編輯課件public interface TableExporterpublic String getExported(String data);編輯課件public class HtmlExporter implements TableExporterpublic String getExported(String data)if(data = null)return ;StringBuffer sb = new StringBuffer();sb.append();for(int i=0;idata.length;i+)sb.append(+datai+);sb.append();return sb.toString();編輯課件public class LineExporter implements TableExporterpublic String getExported(

溫馨提示

  • 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

提交評論