软件体系结构与设计模式第七章策略模式.ppt

上传人:wuy****n92 文档编号:69723813 上传时间:2023-01-08 格式:PPT 页数:23 大小:219.99KB
返回 下载 相关 举报
软件体系结构与设计模式第七章策略模式.ppt_第1页
第1页 / 共23页
软件体系结构与设计模式第七章策略模式.ppt_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《软件体系结构与设计模式第七章策略模式.ppt》由会员分享,可在线阅读,更多相关《软件体系结构与设计模式第七章策略模式.ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第七章第七章 策略模式策略模式 1/8/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/8/20233 策略模式是处理算法的不同变体的一种成熟模策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。将实现接口中的抽象方法。在策略模式中,封装算法标识的接口称作策略,在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。实现该接口的类称作具体策略。二、二、策略模式的结构与使用策略模式的结构与使用

3、1/8/20234策略模式的结构中包括三种角色:策略模式的结构中包括三种角色:策略(策略(StrategyStrategy)具体策略(具体策略(ConcreteStrategyConcreteStrategy)上下文(上下文(ContextContext)1/8/20235策略模式的策略模式的UMLUML类图类图 商品利益存款利息计算利息计算预想利息方式计算确定余款方式计算利益利息计算.计算1/8/20239策略模式的结构的描述与使用策略模式的结构的描述与使用 在某种比赛中有若干个裁判,每位裁判给选手一个得分。选手的最后得分是根据全体裁判的得分计算出来的。请给出几种计算选手得分的评分方案,对于

4、某次比赛,可以从你的方案中选择一种方案作为本次比赛的评分方案。1策略(策略(Strategy):Computable.java public interface ComputableStrategypublic interface ComputableStrategy public abstract double computeScore(double a);public abstract double computeScore(double a);1/8/2023112 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyOne.java

5、 StrategyOne.java(代数平均值方法)(代数平均值方法)public class StrategyOne implements ComputableStrategypublic class StrategyOne implements ComputableStrategy public double computeScore(double a)public double computeScore(double a)double score=0,sum=0;double score=0,sum=0;for(int i=0;ia.length;i+)for(int i=0;ia.le

6、ngth;i+)sum=sum+ai;sum=sum+ai;score=sum/a.length;score=sum/a.length;return score;return score;1/8/2023122 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyTwo.java StrategyTwo.java(去掉最大值和最小值,然后计算代数平均值去掉最大值和最小值,然后计算代数平均值)import java.util.Arrays;import java.util.Arrays;public class StrategyTwo imp

7、lements 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;return 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+)fo

8、r(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;1/8/2023133 3上下文:上下文:GymnasticsGame.java GymnasticsGame.java public class GymnasticsGamepublic class GymnasticsGame ComputableStrategy strategy;ComputableStrategy strategy;public vo

9、id setStrategy(ComputableStrategy strategy)public void setStrategy(ComputableStrategy strategy)this.strategy=strategy;this.strategy=strategy;public double getPersonScore(double a)public double getPersonScore(double a)if(strategy!=null)if(strategy!=null)return puteScore(a);return puteScore(a);else el

10、se return 0;return 0;1/8/2023144 4应用:应用:Application.java_1Application.java_1 public class Applicationpublic class Application public static void main(String args)public static void main(String args)GymnasticsGame game=new GymnasticsGame();GymnasticsGame game=new GymnasticsGame();game.setStrategy(new

11、 StrategyOne();game.setStrategy(new StrategyOne();Person zhang=new Person();Person zhang=new Person();zhang.setName(zhang.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 li=new Person();Person li=new Person();li.setName(li.setName(李四李四););double b

12、=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.getPersonScore(a);li.setScore(game.getPersonScore(b);li.setScore(game.getPersonScore(b);(使用算术平均值方案使用算术平均值方案:);:);(得分得分:,zhang.getName(),zhang.getScore();:,zhang.getName(),z

13、hang.getScore();(得分得分:%5.3f%n,li.getName(),li.getScore();:%5.3f%n,li.getName(),li.getScore();1/8/2023154 4应用:应用: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;p

14、ublic 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;三、三、策略模式的优点策略模式的优点 1/8/202316 上下文(上下文(ContextContext)和具体策略和具体策略(ConcreteStrategyConcr

15、eteStrategy)是松耦合关系。因此上下是松耦合关系。因此上下文只知道它要使用某一个实现文只知道它要使用某一个实现StrategyStrategy接口类的接口类的实例,但不需要知道具体是哪一个类。实例,但不需要知道具体是哪一个类。策略模式满足策略模式满足“开开-闭原则闭原则”。当增加新的具。当增加新的具体策略时,不需要修改上下文类的代码,上下文体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。就可以引用新的具体策略的实例。四、适合使用策略模式的情景一个类定义了多种行为,并且这些行为在这个类中以多个条件语句的形式出现,可以使用策略模式避免在类中使用大量的条件语句。程序

16、不需要暴露复杂的、与算法相关的数据结构,可以使用策略模式封装算法。需要使用一个算法的不同变体。五、例二把数组导出为表格的算法,输入一个数组,导出一个表格,把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出改变输出的结果。如果输出的内容用以网页显示,则输出 JackMayaMikesShadow如果输出的结果用以直接的屏幕输出,则可以输出:如果输出的结果用以直接的屏幕输出,则可以输出:+-+-+-+-+|Jack|Maya|Mikes|Shado

17、w|+-+-+-+-+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

18、 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;idata.length;i+)String str=datai;for(int j=0;jstr.length();j+)top.append(-);mid.append(str)

19、;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);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁