《软件体系结构与设计模式 第七章 策略模式.ppt》由会员分享,可在线阅读,更多相关《软件体系结构与设计模式 第七章 策略模式.ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章第七章 策略模式策略模式 1/6/20231策略模式(别名:政策)策略模式(别名:政策)定定义义一一系系列列算算法法,把把它它们们一一个个个个封封装装起起来来,并并且且使使它它们们可可相相互互替替换换。本本模模式式使使得得算算法法可可独独立立于于使使用用它它的的客客户户而而变变化。化。Strategy Pattern(Another Name:Policy)Define a family of algorithms,encapsulate each one,and make them inter changeable.Strategy lets the algorithm vary in
2、dependently from clients that use it.一一、概述概述 1/6/20233 策略模式是处理算法的不同变体的一种成熟模策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。将实现接口中的抽象方法。在策略模式中,封装算法标识的接口称作策略,在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。实现该接口的类称作具体策略。二、二、策略模式的结构与使用策略模式的结构与使用
3、1/6/20234策略模式的结构中包括三种角色:策略模式的结构中包括三种角色:策略(策略(StrategyStrategy)具体策略(具体策略(ConcreteStrategyConcreteStrategy)上下文(上下文(ContextContext)1/6/20235策略模式的策略模式的UMLUML类图类图 商品利益存款利息计算利息计算预想利息方式计算确定余款方式计算利益利息计算.计算1/6/20239策略模式的结构的描述与使用策略模式的结构的描述与使用 在某种比赛中有若干个裁判,每位裁判给选手一个得分。选手的最后得分是根据全体裁判的得分计算出来的。请给出几种计算选手得分的评分方案,对于
4、某次比赛,可以从你的方案中选择一种方案作为本次比赛的评分方案。1策略(策略(Strategy):Computable.java public interface public interface ComputableStrategyComputableStrategy public abstract double public abstract double computeScore(doublecomputeScore(double a);a);1/6/2023112 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyOne.javaS
5、trategyOne.java (代数平均值方法)(代数平均值方法)public class public class StrategyOneStrategyOne implements implements ComputableStrategyComputableStrategy public double public double computeScore(doublecomputeScore(double a)a)double score=0,sum=0;double score=0,sum=0;for(intfor(int i=0;ia.length;i+)i=0;ia.length
6、;i+)sum=sum+ai;sum=sum+ai;score=sum/a.length;score=sum/a.length;return score;return score;1/6/2023122 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyTwo.javaStrategyTwo.java (去掉最大值和最小值,然后计算代数平均值去掉最大值和最小值,然后计算代数平均值)import java.util.Arrays;import java.util.Arrays;public class public class Strate
7、gyTwoStrategyTwo implements implements ComputableStrategyComputableStrategy public double public double computeScore(doublecomputeScore(double a)a)if(a.length=2)if(a.length=2)return 0;return 0;double score=0,sum=0;double score=0,sum=0;Arrays.sort(a);Arrays.sort(a);for(intfor(int i=1;ia.length-1;i+)i
8、=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;1/6/2023133 3上下文:上下文:GymnasticsGame.javaGymnasticsGame.java public class public class GymnasticsGameGymnasticsGame ComputableStrategyComputableStrategy strategy;strategy;public void public
9、 void setStrategy(ComputableStrategysetStrategy(ComputableStrategy strategy)strategy)this.strategy=strategy;this.strategy=strategy;public double public double getPersonScore(doublegetPersonScore(double a)a)if(strategy!=null)if(strategy!=null)return return puteScore(puteScore(a););else else return 0;
10、return 0;1/6/2023144 4应用:应用:Application.java_1Application.java_1 public class Applicationpublic class Application public static void main(String public static void main(String argsargs)GymnasticsGameGymnasticsGame game=new game=new GymnasticsGameGymnasticsGame();();game.setStrategy(newgame.setStrate
11、gy(new StrategyOneStrategyOne();();Person zhang=new Person();Person zhang=new Person();zhang.setNamezhang.setName(张三张三););double 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 Person lili=new Person();=new Person();li.setNameli.setName(李四李四););double b=9.15,9.26,8.97,9
12、.89,6.97,7.89;double b=9.15,9.26,8.97,9.89,6.97,7.89;zhang.setScore(game.getPersonScore(azhang.setScore(game.getPersonScore(a););li.setScore(game.getPersonScore(bli.setScore(game.getPersonScore(b););System.out.printlnSystem.out.println(使用算术平均值方案使用算术平均值方案:);:);System.out.printlnSystem.out.println(得分得
13、分:,zhang.getName(),zhang.getScore();:,zhang.getName(),zhang.getScore();System.out.printlnSystem.out.println(得分得分:%5.3f%n,li.getName(),li.getScore();:%5.3f%n,li.getName(),li.getScore();1/6/2023154 4应用:应用:Application.java_2Application.java_2class Personclass Person String name;String name;double score
14、;double score;public void public void setScore(doublesetScore(double t)t)score=t;score=t;public void public void setName(StringsetName(String s)s)name=s;name=s;public double public double getScoregetScore()()return score;return score;public String public String getNamegetName()()return name;return n
15、ame;三、三、策略模式的优点策略模式的优点 1/6/202316 上下文(上下文(ContextContext)和具体策略和具体策略(ConcreteStrategyConcreteStrategy)是松耦合关系。因此上下是松耦合关系。因此上下文只知道它要使用某一个实现文只知道它要使用某一个实现StrategyStrategy接口类的接口类的实例,但不需要知道具体是哪一个类。实例,但不需要知道具体是哪一个类。策略模式满足策略模式满足“开开-闭原则闭原则”。当增加新的具。当增加新的具体策略时,不需要修改上下文类的代码,上下文体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例
16、。就可以引用新的具体策略的实例。四、适合使用策略模式的情景一个类定义了多种行为,并且这些行为在这个类中以多个条件语句的形式出现,可以使用策略模式避免在类中使用大量的条件语句。程序不需要暴露复杂的、与算法相关的数据结构,可以使用策略模式封装算法。需要使用一个算法的不同变体。五、例二把数组导出为表格的算法,输入一个数组,导出一个表格,把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出改变输出的结果。如果输出的内容用以网页显示,则输出 JackMay
17、aMikesShadow如果输出的结果用以直接的屏幕输出,则可以输出:如果输出的结果用以直接的屏幕输出,则可以输出:+-+-+-+-+|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 Str
18、ingBuffer();sb.append();for(int i=0;idata.length;i+)sb.append(+datai+);sb.append();return sb.toString();public class LineExporter implements TableExporterpublic String getExported(String data)if(data=null)return;StringBuffer top=new StringBuffer(+);StringBuffer mid=new StringBuffer(|);for(int i=0;id
19、ata.length;i+)String str=datai;for(int j=0;jstr.length();j+)top.append(-);mid.append(str);top.append(+);mid.append(|);top.append(n);mid.append(n);return top.toString()+mid.toString()+top.toString();public class Clientpublic static void main(String args)String data=new StringJack,Maya,Mikes,Shadow;TableExporter tb;tb=new HtmlExporter();System.out.println(tb.getExported(data);tb=new LineExporter();System.out.println(tb.getExported(data);