状态模式

一. 定义

        允许对象在内部状态改变的时改变它的行为,对象看起来好像修改了它的类。

二. 模式起源

三. 原则

四. UML图

五. 代码

5.1 自动饮料售货机类

package model.state;

/**
 * 自动饮料售货机类
 */
public class DrinkMachine {

    private State noMoneyState;
    private State hasMoneyState;
    private State sellState;
    private State soldOutState;

    /**
     * 初始化一个状态  默认是没有饮料状态
     */
    private State state = soldOutState;

    /**
     * 饮料的数量 默认为0
     */
    private Integer count = 0;

    /**
     * 构造函数中维护了所有状态的实例
     *
     * @param drinkCount
     */
    public DrinkMachine(Integer drinkCount) {
        this.noMoneyState = new NoMoneyState(this);
        this.hasMoneyState = new HasMoneyState(this);
        this.sellState = new SellState(this);
        this.soldOutState = new SoldOutState(this);
        this.count = drinkCount;
        if (count > 0) {
            state = noMoneyState;
        }
    }

    public void insertMoney() {
        this.state.insertMoney();
    }

    public void returnMoney() {
        this.state.returnMoney();
    }

    public void turnCrank() {
        this.state.turnCrank();
        this.state.sell();
    }

    /**
     * 设置不同的状态
     *
     * @param state
     */
    public void setState(State state) {
        this.state = state;
    }

    public void releaseDrink() {
        System.out.println("the drink has been given you...");
        if (count != 0) {
            count = count - 1;
        }
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public State getNoMoneyState() {
        return noMoneyState;
    }

    public void setNoMoneyState(State noMoneyState) {
        this.noMoneyState = noMoneyState;
    }

    public State getHasMoneyState() {
        return hasMoneyState;
    }

    public void setHasMoneyState(State hasMoneyState) {
        this.hasMoneyState = hasMoneyState;
    }

    public State getSellState() {
        return sellState;
    }

    public void setSellState(State sellState) {
        this.sellState = sellState;
    }

    public State getSoldOutState() {
        return soldOutState;
    }

    public void setSoldOutState(State soldOutState) {
        this.soldOutState = soldOutState;
    }

    public State getState() {
        return state;
    }


}

5.2 状态接口

package model.state;

/**
 * 状态接口
 */
public interface State {

    /**
     * 投入硬币
     */
    public abstract void insertMoney();

    /**
     * 退还硬币
     */
    public abstract void returnMoney();

    /**
     * 转动曲柄
     */
    public abstract void turnCrank();

    /**
     * 售出饮料
     */
    public abstract void sell();

}

5.3 无硬币状态类

package model.state;

/**
 * 无硬币状态类
 */
public class NoMoneyState implements State {

    // 状态类里面维护了一个(上下文类)饮料机类
    private DrinkMachine drinkMachine;

    public NoMoneyState(DrinkMachine drinkMachine) {
        this.drinkMachine = drinkMachine;
    }

    @Override
    public void insertMoney() {
        System.out.println("you has inserted a coin...");
        this.drinkMachine.setState(this.drinkMachine.getHasMoneyState());
    }

    @Override
    public void returnMoney() {
        System.out.println("you has not inserted a coin...");
    }

    @Override
    public void turnCrank() {
        System.out.println("you turned the crank, but there is no coin in the machine...");
    }

    @Override
    public void sell() {
        System.out.println("you must insert a coin...");
    }
}

5.4 有硬币状态类

package model.state;

/**
 * 有硬币状态
 */
public class HasMoneyState implements State {

    // 状态类里面维护了一个(上下文类)饮料机类
    private DrinkMachine drinkMachine;
    public HasMoneyState(DrinkMachine drinkMachine) {
        this.drinkMachine = drinkMachine;
    }

    @Override
    public void insertMoney() {
        System.out.println("you can not insert another coin...");
    }

    @Override
    public void returnMoney() {
        System.out.println("the coin has been returned...");
        this.drinkMachine.setState(this.drinkMachine.getNoMoneyState());
    }

    @Override
    public void turnCrank() {
        System.out.println("you turned the crank, the machine is ready to sell a drink...");
        this.drinkMachine.setState(this.drinkMachine.getSellState());
    }

    @Override
    public void sell() {
        System.out.println("error operate...");
    }
}

5.5 售出状态类

package model.state;

/**
 * 售出状态类
 */
public class SellState implements State {

    // 状态类里面维护了一个(上下文类)饮料机类
    private DrinkMachine drinkMachine;
    public SellState(DrinkMachine drinkMachine) {
        this.drinkMachine = drinkMachine;
    }

    @Override
    public void insertMoney() {
        System.out.println("waiting... there is a coin in the machine...");
    }

    @Override
    public void returnMoney() {
        System.out.println("sorry, you has turned the crank...");
    }

    @Override
    public void turnCrank() {
        System.out.println("turning the crank twice does not get you another drink...");
    }

    @Override
    public void sell() {
        this.drinkMachine.releaseDrink();
        if(this.drinkMachine.getCount() > 0) {
            this.drinkMachine.setState(this.drinkMachine.getNoMoneyState());
        } else {
            System.out.println("the drink has been sold out...");
            this.drinkMachine.setState(this.drinkMachine.getSoldOutState());
        }

    }
}

5.6 售光状态类

package model.state;

/**
 * 饮料售光状态类
 */
public class SoldOutState implements State {

    // 状态类里面维护了一个(上下文类)饮料机类
    private DrinkMachine drinkMachine;
    public SoldOutState(DrinkMachine drinkMachine) {
        this.drinkMachine = drinkMachine;
    }

    @Override
    public void insertMoney() {
        System.out.println("you can not insert a coin, the drink has been sold out...");
    }

    @Override
    public void returnMoney() {
        System.out.println("you can not return a coin, you do not insert a coin...");
    }

    @Override
    public void turnCrank() {
        System.out.println("you turned the crank, but there is no drink in the machine...");
    }

    @Override
    public void sell() {
        System.out.println("error operate...");
    }
}

5.7 测试类

package model.state;

/**
 * 测试类
 */
public class Main {

    public static void main(String[] args) {

        DrinkMachine drinkMachine = new DrinkMachine(3);

        System.out.println("投入硬币,转动曲柄...");
        drinkMachine.insertMoney();
        drinkMachine.turnCrank();
        System.out.println("the machine has drink :" + drinkMachine.getCount());

        System.out.println("投入硬币,退还硬币...");
        drinkMachine.insertMoney();
        drinkMachine.returnMoney();
        System.out.println("the machine has drink :" + drinkMachine.getCount());

    }

}

5.8 结果

投入硬币,转动曲柄...
you has inserted a coin...
you turned the crank, the machine is ready to sell a drink...
the drink has been given you...
the machine has drink :2
投入硬币,退还硬币...
you has inserted a coin...
the coin has been returned...
the machine has drink :2

六. 感悟

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值