软件体系结构与设计模式 第七章策略模式_第1页
软件体系结构与设计模式 第七章策略模式_第2页
软件体系结构与设计模式 第七章策略模式_第3页
软件体系结构与设计模式 第七章策略模式_第4页
软件体系结构与设计模式 第七章策略模式_第5页
已阅读5页,还剩18页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章第七章 策略模式策略模式 2022-5-91策略模式(别名:政策)策略模式(别名:政策) 定义一系列算法,把它们一个个封装起来,并且使它们定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变可相互替换。本模式使得算法可独立于使用它的客户而变化。化。Strategy Pattern(Another Name: Policy) Define a family of algorithms, encapsulate each one, and make them inter changeable. Strategy lets the algorith

2、m vary independently from clients that use it. 一一 、 概述概述 2022-5-93 策略模式是处理算法的不同变体的一种成熟策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。的类将实现接口中的抽象方法。 在策略模式中,封装算法标识的接口称作策在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。略,实现该接口的类称作具体策略。 二、二、策略模式的结构

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

4、给出几种计算选手得分的评分方案,对于某次比赛,可以从你的方案中选择一种方案作为本次比赛的评分方案。 1策略(策略(Strategy) : Computable.java public interface ComputableStrategypublic interface ComputableStrategy public abstract double computeScore(double public abstract double computeScore(double a); a); 2022-5-9112 2具体策略(具体策略(ConcreteStrategyConcreteStr

5、ategy): : StrategyOne.javaStrategyOne.java (代数平均值方法)(代数平均值方法)public class StrategyOne implements ComputableStrategypublic class StrategyOne implements ComputableStrategy public double computeScore(double public double computeScore(double a) a) double score=0,sum=0; double score=0,sum=0; for(int for(

6、int i=0;ia.length;i+) i=0;ia.length;i+) sum=sum+ai; sum=sum+ai; score=sum/a.length; score=sum/a.length; return score; return score; 2022-5-9122 2具体策略(具体策略(ConcreteStrategyConcreteStrategy): : StrategyTwo.javaStrategyTwo.java ( (去掉最大值和最小值,然后计算代数平均值去掉最大值和最小值,然后计算代数平均值) )import java.util.Arrays;import

7、java.util.Arrays;public class StrategyTwo implements ComputableStrategypublic class StrategyTwo implements ComputableStrategy public double computeScore(double public double computeScore(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

8、.sort(a); Arrays.sort(a); for(int for(int i=1;ia.length-1;i+) 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; 2022-5-9133 3上下文:上下文: GymnasticsGame.javaGymnasticsGame.java public class GymnasticsGamepublic class GymnasticsGame Co

9、mputableStrategy ComputableStrategy strategy; strategy; public void setStrategy(ComputableStrategy public void setStrategy(ComputableStrategy strategy) strategy) this.strategy=strategy; this.strategy=strategy; public double getPersonScore(double public double getPersonScore(double a) a) if(strategy!

10、=null) if(strategy!=null) return puteScore(a return puteScore(a); ); else else return 0; return 0; 2022-5-9144 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=ne

11、w 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 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

12、,7.88; Person li Person li=new Person();=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.getPersonScore(a);); li.setScore(game.getPersonScore(b li.setScore(game.getPe

13、rsonScore(b);); System.out.println System.out.println(使用算术平均值方案使用算术平均值方案:);:); System.out.println System.out.println(得分得分:,zhang.getName(),zhang.getScore();:,zhang.getName(),zhang.getScore(); System.out.println System.out.println(得分得分:%5.3f%n,li.getName(),li.getScore();:%5.3f%n,li.getName(),li.getSc

14、ore();2022-5-9154 4应用:应用: Application.java_2Application.java_2class Personclass Person String name; String name; double score; double score; public void setScore(double public void setScore(double t) t) score=t; score=t; public void setName(String public void setName(String s) s) name=s; name=s; pub

15、lic double getScore public double getScore()() return score; return score; public String getName public String getName()() return name; return name; 三、三、策略模式的优点策略模式的优点 2022-5-916 上下文(上下文(ContextContext)和具体策略)和具体策略(ConcreteStrategyConcreteStrategy)是松耦合关系。因此上下)是松耦合关系。因此上下文只知道它要使用某一个实现文只知道它要使用某一个实现Stra

16、tegyStrategy接口类的接口类的实例,但不需要知道具体是哪一个类。实例,但不需要知道具体是哪一个类。 策略模式满足策略模式满足“开开- -闭原则闭原则”。当增加新的。当增加新的具体策略时,不需要修改上下文类的代码,上下具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。文就可以引用新的具体策略的实例。四、适合使用策略模式的情景 一个类定义了多种行为,并且这些行为在这个类中以多个条件语句的形式出现,可以使用策略模式避免在类中使用大量的条件语句。 程序不需要暴露复杂的、与算法相关的数据结构,可以使用策略模式封装算法。 需要使用一个算法的不同变体。五、例二 把数组导出为

17、表格的算法,输入一个数组,导出一个表格,把数组导出为表格的算法,输入一个数组,导出一个表格,当用户想改变导出的表格时,便可以通过改变输出的算法当用户想改变导出的表格时,便可以通过改变输出的算法改变输出的结果。如果输出的内容用以网页显示,则输出改变输出的结果。如果输出的内容用以网页显示,则输出 JackMayaMikesShadow 如果输出的结果用以直接的屏幕输出,则可以输出:如果输出的结果用以直接的屏幕输出,则可以输出: +-+-+-+-+ |Jack|Maya|Mikes|Shadow| +-+-+-+-+public interface TableExporterpublic Strin

18、g 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 TableExporter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论