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