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(); }}
复制代码
编译并运行程序,输出如下结果:
直升机起飞:垂直起飞直升机飞行:亚音速飞行
客机起飞:长距离起飞客机飞行:亚音速飞行
复制代码
评论