概述
通过按钮来控制糖果机,它有几种状态:售完,没有检测到钱,检测到钱,售出。
创建一个糖果机接口:
public interface State {
public final static int SOLE_OUT=1; //售完
public final static int NO_QUARTER=2; //没有
public final static int HAS_QUARTER=3;//有
public final static int SOLE=4;//售出
}
创建类实现接口
public class InSertQuarter {
public int _state = State.SOLE_OUT;
public void inSertQuarterFun() {
switch (_state) {
case State.SOLE_OUT:
System.out.println("SOLE_OUT");
break;
case State.NO_QUARTER:
System.out.println("NO_QUARTER");
break;
case State.HAS_QUARTER:
System.out.println("HAS_QUARTER");
break;
case State.SOLE:
System.out.println("SOLE");
_state=State.SOLE_OUT; //变成售完状态
break;
default:
System.out.println("default");
break;
}
}
}
假如我们卖完最后一颗糖果,卖完后糖果机从出售状态变成售完状态。
可以在当中加入其他的判断条件。
测试类
public class Main {
public static void main(String[] args) {
InSertQuarter inSertQuarter = new InSertQuarter();
inSertQuarter._state=State.SOLE;
inSertQuarter.inSertQuarterFun();
inSertQuarter.inSertQuarterFun();
}
}
输出结果为:
SOLE
SOLE_OUT
状态模式结构
环境(Context)角色:也称为上下文,它定义了客户程序需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理
抽象状态(State)角色:定义一个接口,用以封装环境对象的特定状态所对应的行为。
具体状态(Concrete State)角色:实现抽象状态所对应的行为。
优缺点
优点:
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
缺点:
状态模式的使用必然增加新同类的对象个数。
状态模式的结构与实现都较为复杂,使用不当会导致程序结构和代码的混乱。
状态模式对“开闭原则”的支持并不好
使用场景
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,可以考虑使用状态模式。
一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。