Java设计模式-状态模式

文章目录

背景

机体工厂新研制出一种全方位适应海陆空宇的机体,代号艾克萨兰斯。究竟如何实现的呢?我们采访下研发人员爱因斯坦。
记者:爱因斯坦先生,您好!听说实验室里诞生了一架全地形适应的机体–艾克萨兰斯,您可以讲讲是怎么回事吗?
爱因斯坦(一本正经的胡说八道):全地形适应的机体造价昂贵,而且一般不能达到绝对的适应。我们采用一种特殊的工程方法,解决了这个难题。这个方法我们称为–换装。
记者:换装?您说的是类似换衣服的操作吧?
爱因斯坦:可以这么理解。艾克萨兰斯的核心是一架战斗机,可以把它看成人的身体。艾克萨兰斯有四套装甲:陆战装、海战装、空战装和宇宙战装,装甲可以看作衣服。每次艾克萨兰斯发起换装请求,母舰第一时间把装甲发射给战斗机,即可完成换装操作。而且每套装甲都有其优势,机师可根据不同地形选择不同的装甲。
记者:听起来很棒!我很想知道是怎么实现的?
爱因斯坦:虽然涉及到军事机密,但是为了科(装)普(逼),我还是把大概的原理给你讲。

实现

艾克萨兰斯机体

/**
 * 艾克萨兰斯机体
 * 注:艾克萨兰斯是劳尔的座驾,这台机体的特性是能够装备不同的装甲,机战里面的术语叫做换装。
 */
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)
总结

这就是总结。精彩继续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值