背景
机体工厂新研制出一种全方位适应海陆空宇的机体,代号艾克萨兰斯。究竟如何实现的呢?我们采访下研发人员爱因斯坦。
记者:爱因斯坦先生,您好!听说实验室里诞生了一架全地形适应的机体–艾克萨兰斯,您可以讲讲是怎么回事吗?
爱因斯坦(一本正经的胡说八道):全地形适应的机体造价昂贵,而且一般不能达到绝对的适应。我们采用一种特殊的工程方法,解决了这个难题。这个方法我们称为–换装。
记者:换装?您说的是类似换衣服的操作吧?
爱因斯坦:可以这么理解。艾克萨兰斯的核心是一架战斗机,可以把它看成人的身体。艾克萨兰斯有四套装甲:陆战装、海战装、空战装和宇宙战装,装甲可以看作衣服。每次艾克萨兰斯发起换装请求,母舰第一时间把装甲发射给战斗机,即可完成换装操作。而且每套装甲都有其优势,机师可根据不同地形选择不同的装甲。
记者:听起来很棒!我很想知道是怎么实现的?
爱因斯坦:虽然涉及到军事机密,但是为了科(装)普(逼),我还是把大概的原理给你讲。
实现
艾克萨兰斯机体
/**
* 艾克萨兰斯机体
* 注:艾克萨兰斯是劳尔的座驾,这台机体的特性是能够装备不同的装甲,机战里面的术语叫做换装。
*/
public class AksalansRobot {
// 四种状态
private AirBattleArmourState airState = new AirBattleArmourState(this);
private LandBattleArmourState landState = new LandBattleArmourState(this);
private NavalBattleArmourState navalState = new NavalBattleArmourState(this);
private UniverseBattleArmourState universeState = new UniverseBattleArmourState(this);
// 当前状态
private ArmourState armourState;
public AksalansRobot() {
super();
this.armourState = landState; // 默认陆战装
}
/**
* 设置状态
*/
public void setArmourState(ArmourState armourState) {
this.armourState = armourState;
}
public AirBattleArmourState getAirState() {
return airState;
}
public void setAirState(AirBattleArmourState airState) {
this.airState = airState;
}
public LandBattleArmourState getLandState() {
return landState;
}
public void setLandState(LandBattleArmourState landState) {
this.landState = landState;
}
public NavalBattleArmourState getNavalState() {
return navalState;
}
public void setNavalState(NavalBattleArmourState navalState) {
this.navalState = navalState;
}
public UniverseBattleArmourState getUniverseState() {
return universeState;
}
public void setUniverseState(UniverseBattleArmourState universeState) {
this.universeState = universeState;
}
public ArmourState getArmourState() {
return armourState;
}
}
换装状态
/**
* 艾克萨兰斯机体换装状态
*/
public abstract class ArmourState {
private AksalansRobot robot;
public ArmourState(AksalansRobot robot) {
super();
this.robot = robot;
}
/**
* 切换空战装
*/
void changeAirBattleState() {
System.out.println("切换到空战装");
robot.setArmourState(robot.getAirState());
}
/**
* 切换海战装
*/
void changeNavalBattleState() {
System.out.println("切换到海战装");
robot.setArmourState(robot.getNavalState());
}
/**
* 切换陆战装
*/
void changeLandBattleState() {
System.out.println("切换到陆战装");
robot.setArmourState(robot.getLandState());
}
/**
* 切换宇宙战装
*/
void changeUniverseBattleState() {
System.out.println("切换到宇宙战装");
robot.setArmourState(robot.getUniverseState());
}
}
陆战装
/**
* 陆战装
*/
public class LandBattleArmourState extends ArmourState {
public LandBattleArmourState(AksalansRobot robot) {
super(robot);
}
@Override
void changeLandBattleState() {
throw new UnsupportedOperationException("已经是陆战装了,亲");
}
@Override
public String toString() {
return "陆战装!";
}
}
海战装
/**
* 海战装
*/
public class NavalBattleArmourState extends ArmourState {
public NavalBattleArmourState(AksalansRobot robot) {
super(robot);
}
@Override
void changeNavalBattleState() {
throw new UnsupportedOperationException("已经是海战装了,亲");
}
@Override
public String toString() {
return "海战装!";
}
}
空战装
/**
* 空战装
*/
public class AirBattleArmourState extends ArmourState {
public AirBattleArmourState(AksalansRobot robot) {
super(robot);
}
@Override
void changeAirBattleState() {
throw new UnsupportedOperationException("已经是空战装了,亲");
}
@Override
public String toString() {
return "空战装!";
}
}
宇宙战装
/**
* 宇宙战装
*/
public class UniverseBattleArmourState extends ArmourState {
public UniverseBattleArmourState(AksalansRobot robot) {
super(robot);
}
@Override
void changeUniverseBattleState() {
throw new UnsupportedOperationException("已经是宇宙战装了,亲");
}
@Override
public String toString() {
return "宇宙装!";
}
}
测试
public class StateTest {
public static void main(String[] args) {
AksalansRobot robot = new AksalansRobot();
System.out.println(robot.getArmourState().toString());
System.out.println("------------");
robot.getArmourState().changeAirBattleState();
System.out.println(robot.getArmourState().toString());
System.out.println("------------");
robot.getArmourState().changeUniverseBattleState();;
System.out.println(robot.getArmourState().toString());
System.out.println("------------");
robot.getArmourState().changeNavalBattleState();
System.out.println(robot.getArmourState().toString());
System.out.println("------------");
// 异常情况
robot.getArmourState().changeNavalBattleState();
System.out.println(robot.getArmourState().toString());
System.out.println("------------");
}
}
测试结果
陆战装!
------------
切换到空战装
空战装!
------------
切换到宇宙战装
宇宙装!
------------
切换到海战装
海战装!
------------
Exception in thread "main" java.lang.UnsupportedOperationException: 已经是海战装了,亲
at com.srw.design.state.NavalBattleArmourState.changeNavalBattleState(NavalBattleArmourState.java:14)
at com.srw.design.state.StateTest.main(StateTest.java:19)
总结
这就是总结。精彩继续…