一、状态模式
允许对象在内部状态改变时改变它的行为,对像看起来好像修改了它的类。
二、举例
设计一个糖果机,要求如下
- 糖果机有四个状态
- 有硬币
- 无硬币
- 转轴
- 投放糖果
状态接口类
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();
}
}
本文通过实例讲解如何使用状态模式设计一个模拟糖果机的类,包含无硬币、已投币、转轴和已售罄四种状态,展示了如何根据状态变化调整对象行为。

被折叠的 条评论
为什么被折叠?



