写点什么

设计模式的艺术 第二十四章策略设计模式练习(开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,为了将来能够模拟更多种类的飞机,试采用策略模式设计该飞机模拟系统)

作者:代廉洁
  • 2022 年 9 月 04 日
    浙江
  • 本文字数:1916 字

    阅读完需:约 6 分钟

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


飞机种类及特征一览表


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


一、类结构图



抽象策略类:设计为两个抽象策略类,抽象策略类 AbstractStartFlyStrategy、包含 startFly()抽象方法,抽象策略类 AbstractNormalFlyStrategy、包含 normalFly()抽象方法,设计为两个抽象策略类实现内部算法的复用;

环境类:设计为名称为 Plane 的具体类,面向抽象策略类编程,持有对两个抽象策略类的引用,包含具体方法 takeOff()、具体方法 fly();

具体策略类:设计为抽象策略类的子类,具体类 VerticalStartFlyStrategy、具体类 LongDisStartFlyStrategy 为抽象策略类 AbstractStartFlyStrategy 的子类,分别实现抽象方法 startFly(),具体类 SubSonicNormalFlyStrategy、具体类 SuperSonicNormalFlyStrategy 为抽象策略类 AbstractNormalFlyStrategy 的子类,分别实现抽象方法 normalFly()。


二、典型实现代码

抽象起飞策略类:抽象策略类
// 抽象起飞策略类:抽象策略类public abstract class AbstractStartFlyStrategy {    public abstract void startFly();}
复制代码


抽象飞行策略类:抽象策略类
// 抽象飞行策略类:抽象策略类public abstract class AbstractNormalFlyStrategy {    public abstract void normalFly();}
复制代码


具体飞机类:具体环境类
// 具体飞机类:具体环境类public class Plane {    private String name;    private AbstractStartFlyStrategy startFlyStrategy;    private AbstractNormalFlyStrategy normalFlyStrategy;
public Plane(String name) { this.name = name; }
public void setStartFlyStrategy(AbstractStartFlyStrategy startFlyStrategy) { this.startFlyStrategy = startFlyStrategy; }
public void setNormalFlyStrategy(AbstractNormalFlyStrategy normalFlyStrategy) { this.normalFlyStrategy = normalFlyStrategy; }
public void takeOff() { System.out.println(this.name + "起飞:"); this.startFlyStrategy.startFly(); }
public void fly() { System.out.println(this.name + "飞行:"); this.normalFlyStrategy.normalFly(); }}
复制代码


垂直起飞策略类:具体策略类
// 垂直起飞策略类:具体策略类public class VerticalStartFlyStrategy extends AbstractStartFlyStrategy{    @Override    public void startFly() {        System.out.println("垂直起飞");    }}
复制代码


长距离起飞策略类:具体策略类
// 长距离起飞策略类:具体策略类public class LongDisStartFlyStrategy extends AbstractStartFlyStrategy{    @Override    public void startFly() {        System.out.println("长距离起飞");    }}
复制代码


亚音速飞行策略类:具体策略类
// 亚音速飞行策略类:具体策略类public class SubSonicNormalFlyStrategy extends AbstractNormalFlyStrategy{    @Override    public void normalFly() {        System.out.println("亚音速飞行");    }}
复制代码


超音速飞行策略类:具体策略类
// 超音速飞行策略类:具体策略类public class SuperSonicNormalFlyStrategy extends AbstractNormalFlyStrategy{    @Override    public void normalFly() {        System.out.println("超音速飞行");    }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        Plane helicopter, airPlane;        AbstractStartFlyStrategy startFlyStrategy;        AbstractNormalFlyStrategy normalFlyStrategy;
helicopter = new Plane("直升机"); airPlane = new Plane("客机"); startFlyStrategy = new VerticalStartFlyStrategy(); normalFlyStrategy = new SubSonicNormalFlyStrategy();
helicopter.setStartFlyStrategy(startFlyStrategy); helicopter.setNormalFlyStrategy(normalFlyStrategy); helicopter.takeOff(); helicopter.fly();
System.out.println();
startFlyStrategy = new LongDisStartFlyStrategy(); airPlane.setStartFlyStrategy(startFlyStrategy); airPlane.setNormalFlyStrategy(normalFlyStrategy); airPlane.takeOff(); airPlane.fly(); }}
复制代码


编译并运行程序,输出如下结果:
直升机起飞:垂直起飞直升机飞行:亚音速飞行
客机起飞:长距离起飞客机飞行:亚音速飞行
复制代码


发布于: 刚刚阅读数: 3
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第二十四章策略设计模式练习(开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,为了将来能够模拟更多种类的飞机,试采用策略模式设计该飞机模拟系统)_设计模式的艺术_代廉洁_InfoQ写作社区