你知道状态模式吗?

本文通过实例讲解如何使用状态模式设计一个模拟糖果机的类,包含无硬币、已投币、转轴和已售罄四种状态,展示了如何根据状态变化调整对象行为。

一、状态模式

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

二、举例

设计一个糖果机,要求如下

  • 糖果机有四个状态
  • 有硬币
  • 无硬币
  • 转轴
  • 投放糖果

状态接口类

package com.jackeys.StateMode;

/**
 * @Description: 状态接口
 * @ClassName: State
 * @Package com.jackeys
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 10:52
 * @Version: 1.0
 */
public interface State {
    /**
     * 放入硬币状态
     */
    void insertQuarter();

    /**
     * 退还硬币状态
     */
    void ejectQuarter();

    /**
     * 转动轴状态
     */
    void turnCrank();

    /**
     * 发放糖果状态
     */
    void dispense();
}

已投币状态类

package com.jackeys.StateMode;

/**
 * @Description: 已投币状态
 * @ClassName: HasQuarterState
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 13:20
 * @Version: 1.0
 */
public class HasQuarterState implements State{

    private GumballMachine gumballMachine;
    public HasQuarterState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }
    @Override
    public void insertQuarter() {
        System.out.println("你已经投过币了");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("硬币退还成功");
        this.gumballMachine.setState(gumballMachine.getNoQuarterState());
    }

    @Override
    public void turnCrank() {
        System.out.println("转轴中...");
        this.gumballMachine.setState(gumballMachine.getSoldState());
    }

    @Override
    public void dispense() {
        System.out.println("你还没有转轴");
    }
}

未投币状态类

package com.jackeys.StateMode;

/**
 * @Description: 没有投币状态
 * @ClassName: NoQuarterState
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 11:40
 * @Version: 1.0
 */
public class NoQuarterState implements State {
    private GumballMachine gumballMachine;

    public NoQuarterState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("你投入了一枚硬币");
        this.gumballMachine.setState(gumballMachine.getHasQuarterState());
    }

    @Override
    public void ejectQuarter() {
        System.out.println("你还没有投币,不能退还");
    }

    @Override
    public void turnCrank() {
        System.out.println("你还没有投币,拉动转轴没有糖果");
    }

    @Override
    public void dispense() {
        System.out.println("你需要先投币");
    }
}

已售罄状态类

package com.jackeys.StateMode;

/**
 * @Description: 已售罄状态
 * @ClassName: SoldOutState
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 13:37
 * @Version: 1.0
 */
public class SoldOutState implements State{

    private GumballMachine gumballMachine;

    public SoldOutState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("糖果已经售罄");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("糖果已经售罄");
        this.gumballMachine.setState(this.gumballMachine.getNoQuarterState());
    }

    @Override
    public void turnCrank() {
        System.out.println("糖果已经售罄");
    }

    @Override
    public void dispense() {
        System.out.println("糖果已经售罄");
    }
}

发放糖果状态类

package com.jackeys.StateMode;

/**
 * @Description: 发放糖果状态
 * @ClassName: SoldState
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 13:25
 * @Version: 1.0
 */
public class SoldState implements State {
    private GumballMachine gumballMachine;

    public SoldState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("请稍等,我们在给你发放糖果,请不要再投币哦");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("很抱歉,你已经转轴,不能退还");
    }

    @Override
    public void turnCrank() {
        System.out.println("你已经转过轴了,请等待发放糖果");
    }

    @Override
    public void dispense() {
        this.gumballMachine.releaseBall();
        if (this.gumballMachine.getCount() > 0) {
            this.gumballMachine.setState(this.gumballMachine.getNoQuarterState());
        } else {
            System.out.println("糖果已经售罄");
            this.gumballMachine.setState(gumballMachine.getSoldOutState());
        }
    }
}

糖果机器类

package com.jackeys.StateMode;

/**
 * @Description: 糖果机
 * @ClassName: GumballMachine
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 11:41
 * @Version: 1.0
 */
public class GumballMachine {
    /**
     * 无糖果状态
     */
    private State soldOutState;
    /**
     * 无投币状态
     */
    private State noQuarterState;
    /**
     * 已投币状态
     */
    private State hasQuarterState;
    /**
     * 糖果发放状态
     */
    private State soldState;

    private State state = soldOutState;
    private int count = 0;


    public GumballMachine(int numberGumballs) {
        this.count = numberGumballs;
        this.noQuarterState = new NoQuarterState(this);
        this.hasQuarterState = new HasQuarterState(this);
        this.soldState = new SoldState(this);
        this.soldOutState = new SoldOutState(this);
        this.state = noQuarterState;
    }
    /**
     * 放入硬币状态
     */
   public void insertQuarter(){
       this.state.insertQuarter();

   };

    /**
     * 退还硬币状态
     */
   public void ejectQuarter() {
     this.state.ejectQuarter();
    }

    /**
     * 转动轴状态
     */
    public void turnCrank() {
        this.state.turnCrank();
        this.state.dispense();
    }

    /**
     * 售罄状态
     */
    public void dispense() {
        this.state.dispense();
    }

    public State getSoldOutState() {
        return soldOutState;
    }

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

    public State getNoQuarterState() {
        return noQuarterState;
    }

    public void setNoQuarterState(State noQuarterState) {
        this.noQuarterState = noQuarterState;
    }

    public State getHasQuarterState() {
        return hasQuarterState;
    }

    public void setHasQuarterState(State hasQuarterState) {
        this.hasQuarterState = hasQuarterState;
    }

    public State getSoldState() {
        return soldState;
    }

    public void setSoldState(State soldState) {
        this.soldState = soldState;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public int getCount() {
        return count;
    }

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

    public void releaseBall() {
        System.out.println("正在放出糖果");
        if (this.count != 0) {
            this.count--;
        }
    }
}

测试类

package com.jackeys.StateMode;

/**
 * @Description: 测试状态模式
 * @ClassName: Test
 * @Package com.jackeys.StateMode
 * @Author: Jackeys 1623427047@qq.com
 * @Copyright 版权归Jackeys企业(或个人)所有
 * @CreateTime: 2021/10/26 13:42
 * @Version: 1.0
 */
public class Test {
    public static void main(String[] args) {
        GumballMachine gumballMachine = new GumballMachine(4);
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.ejectQuarter();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();
        gumballMachine.insertQuarter();
        gumballMachine.turnCrank();


    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值