看了刘伟老师的设计模式里面的策略模式,做一下后面的练习题。算法的封装与切换——策略模式(四)_刘伟技术博客-CSDN博客史上最全设计模式导学目录(完整版)_刘伟技术博客-CSDN博客

练习

Sunny软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表24-1所示:

为将来能够模拟更多种类的飞机,试采用策略模式设计该飞机模拟系统。

表24-1 飞机种类及特征一览表

首先分析问题,首先具体对象是飞机, 飞机有不同的种类(直升机,客机,歼击机,鹞式战斗机),然后飞机有两个动作,一个是起飞,一个是飞行,不同种类的飞机这两个动作会有不同的特征。这里我们定义一个抽象类Air , 定义3个方法 起飞takeOff(), 飞行fly(), 开始飞行 startFly();其中开始飞行方法里面调用起飞和飞行(这里用到的是就是模板方法模式模板方法模式深度解析(一)_刘伟技术博客-CSDN博客_模板方法模式)。

这里还可以细分,一次完整的飞行操作包括:起飞,飞行,降落3个步骤。还可以把降落方法定义出来,放在:开始飞行 startFly() 里面。

package com.pattern.strategy.abs;public abstract class Air {protected String name;public Air(String name) {this.name = name;}/*** 起飞*/public abstract void takeOff();/*** 飞行*/public abstract void fly();//降落public void land(){System.out.println(name + "降落!");}/*** 开始飞行*/public void startFly(){System.out.println(name + "开始飞行!");takeOff();fly();land();}
}

然后定义不同的飞机,飞机继承Air

package com.pattern.strategy;import com.pattern.strategy.abs.Air;
//客机
public class AirPlane extends Air {public AirPlane(String name) {super(name);}@Overridepublic void takeOff() {System.out.println(name + "长距离起飞(LongDistanceTakeOff)");}@Overridepublic void fly() {System.out.println(name + "亚音速飞行(SubSonicFly)");}
}
//歼击机
public class Fighter extends Air {public Fighter(String name) {super(name);}@Overridepublic void takeOff() {System.out.println(name + "长距离起飞(LongDistanceTakeOff)");}@Overridepublic void fly() {System.out.println(name + "超音速飞行(SuperSonicFly)");}
}
//鹞式战斗机
public class Harrier extends Air {public Harrier(String name) {super(name);}@Overridepublic void takeOff() {System.out.println(name + "垂直起飞(VerticalTakeOff)");}@Overridepublic void fly() {System.out.println(name + "超音速飞行(SuperSonicFly)");}
}
//直升机
public class Helicopter extends Air {public Helicopter(String name) {super(name);}@Overridepublic void takeOff() {System.out.println(name + "垂直起飞VerticalTakeOff");}@Overridepublic void fly() {System.out.println(name + "亚音速飞行(SubSonicFly)");}
}

定义好后可以测试了:在测试这里定义了一个Map来存储飞机和类之间的关系,通过main函数里面的参数args来传入具体飞机,

package com.pattern.strategy;import com.pattern.strategy.abs.Air;import java.util.HashMap;
import java.util.Map;public class Client {public static void main(String[] args){if(args.length == 0){System.out.println("飞机名称不正确");return;}Map<String,String> airMap = new HashMap<>();airMap.put("直升机","com.pattern.strategy.Helicopter");airMap.put("客机","com.pattern.strategy.AirPlane");airMap.put("歼击机","com.pattern.strategy.Fighter");airMap.put("鹞式战斗机","com.pattern.strategy.Harrier");String name = args[0];String className = airMap.get(name);if(className == null){System.out.println("飞机名称不正确");return;}try {//找到飞机对应的classClass clazz = Class.forName(className);//创建飞机对象Air air = (Air) clazz.getDeclaredConstructor(String.class).newInstance(name);//飞机起飞air.startFly();}catch (Exception e){e.printStackTrace();System.out.println("飞机事故");}}
}

传入具体参数:

运行结果:

直升机开始飞行!
直升机垂直起飞VerticalTakeOff
直升机亚音速飞行(SubSonicFly)
直升机降落!

总结:策略模式和工厂模式一起用能比较容易的解决策略的选择问题。同一件事如果需要按照顺序执行不同的步骤,可以使用模板方法模式来实现。

设计模式-策略模式,模板方法模式练习相关推荐

  1. 咖啡泡JAVA_java《Head First 设计模式》之模板方法模式——冲泡咖啡和茶

    <Head First 设计模式>之模板方法模式--冲泡咖啡和茶 模板方法模式(Template) 在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  2. Java设计模式9,模板方法模式

    目录 一.模板方法模式 二.模板方法模式的结构 三.模板方法模式的优缺点 1.优点 2.缺点 四.模板方法模式的使用场景 五.通过模板方法模式实现 抽象类WorkDay 1.顶级抽象类 2.项目经理的 ...

  3. 李建忠设计模式-组件协作模式-模板方法模式

    目录 1.前言 2.模板方法模式(Template Method) 1.动机 2.例子 3.定义 1.结构图 2.模板方法模式适用情形 3.模式特点 参考 1.前言 现代软件专业分工后的第一个结果是& ...

  4. 设计模式 — 行为型模式 — 模板方法模式

    目录 文章目录 目录 模板方法模式 应用场景 代码示例 模板方法模式 模板方法模式,定义一个算法或者流程,部分环节设计为外部可变,用类似于模板的思想来实例化一个实体,可以往模板中填充不同的内容: 在模 ...

  5. 《设计模式详解》行为型模式 - 模板方法模式

    模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...

  6. Java设计模式系列之——模板方法模式

    大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...

  7. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  8. 【HeadFirst设计模式】8.模板方法模式

    模板方法 定义: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使用得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 策略模式: 定义一个算法家族,并让这些算法可以互 ...

  9. 学习php开发步骤,学习php设计模式 php实现模板方法模式

    一.意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method 使得子类可以在不改变一个算法的结构的情况下重定义该算法的某些特定的步骤[GOF95] 二.模板方法模式结 ...

  10. 小话设计模式五:模板方法模式

    模板方法模式定义: 定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板方法解析: 模板方法模式是比较简单的一种设计 ...

最新文章

  1. C# DllImport
  2. 【科技金融】互金欺诈黑话大集锦
  3. FastDFS文件上传和下载流程
  4. C#类型与SQLSEVER类型对比
  5. ubuntu窗口最小化消失,任务栏上无法找到的解决方法
  6. [Python Study Notes]电池信息
  7. scala中的match
  8. [工作习惯]一种管理文献的方法,抛弃EndNote
  9. IDL| 数据分割读取
  10. migo通过预留单目的地 可修改_金蝶K/3ERP系统应用教程:生产投料单的维护
  11. Logisim实验一
  12. l360清零软件无响应_爱普生epson l360清零软件免费版
  13. Atheros AR9285 坑爹网卡只有 54M/65M,开启 150M 速率的方法
  14. Linux 命令(223)—— reboot 命令
  15. 效率工具 Snipaste、坚果云、印象笔记
  16. 从零开始搭建仿抖音短视频APP-后端开发粉丝业务模块(2)
  17. linux服务器监控
  18. 银行管理系统 Java语句
  19. python中的header是什么意思_python中header是什么意思啊
  20. 数美科技风控前沿| AIGC需要什么内容风控基建?ChatGPT本“人”有话要说

热门文章

  1. 托福字典:progressively托福考试详解
  2. 使用python抓取美团商家信息
  3. 王老吉三亿元投资雅安被质疑作秀九
  4. 使用WMI来控制Windows服务
  5. cordova编译crosswalk-webview插件报错的处理办法
  6. 国产Excel处理控件spire.xls,新版抢先看~
  7. 11月25日:盒子模型
  8. Qs II将工程文件打包发送给别人和解包总结
  9. Android 启动页加载gif、视频、图片、并下载到本地
  10. php云打印机,云打印机对接说明