1.什么是状态机
状态机(State Machine)是一种抽象的计算模型,用于描述一个系统在不同状态之间的转换以及触发这些转换的事件。它由状态、事件、动作和转换规则组成。状态代表系统在某个时刻的行为模式;事件是引起状态转换的外部或内部信号;动作是在状态转换时执行的操作;转换规则定义了在接收到特定事件后,系统如何从一个状态转移到另一个状态。
2.用java示例设计一个自动售货机
想象你有一台自动售货机,它会根据你的行为(比如投币、选择商品、取消等)做出响应。这台机器不是一次性执行所有任务,而是根据当前所处的状态(比如等待投币、正在出售等)来决定下一步做什么。这就是状态机的核心思想:
- 状态(State): 描述系统当前的行为模式。比如自动售货机可以处于"空闲"、"接受硬币"、"出售商品"或"退币"等状态。
- 事件(Event): 触发状态转换的动作。例如,用户投币是一个事件,选择商品也是一个事件。
- 转换(Transition): 当特定事件发生时,从一个状态转移到另一个状态的过程。
- 动作(Action): 在状态转换时执行的操作,比如打印消息或者实际执行某些功能。
3.java代码解析
(1)状态定义
首先定义一个枚举State来表示自动售货机的各个状态:
enum State
{
IDLE, // 初始状态,等待操作
ACCEPTING_COIN, // 正在接受硬币
SELLING, // 正在出售商品
RETURNING_COIN // 正在退币
}
(2)实现自动售货机类
接着,我们创建一个VendingMachine类,它包含了模拟自动售货机行为的方法:
public class VendingMachine {
private State currentState = State.IDLE; // 初始状态设为IDLE
// 投入硬币
public void insertCoin() {
// 如果当前是空闲状态,接受硬币并改变状态到"接受硬币"
if (currentState == State.IDLE) {
System.out.println("接受硬币...");
currentState = State.ACCEPTING_COIN;
} else {
System.out.println("不能投币,机器不在空闲状态。");
}
}
// 选择商品
public void selectProduct() {
// 只有在接受硬币状态下才能选择商品
if (currentState == State.ACCEPTING_COIN) {
System.out.println("选择商品,开始出售...");
currentState = State.SELLING; // 改变状态到"出售商品"
} else {
System.out.println("请先投币。");
}
}
// 取消购买
public void cancel() {
// 如果在接受硬币或出售商品状态,可以取消操作并退币
if (currentState == State.ACCEPTING_COIN || currentState == State.SELLING) {
System.out.println("取消购买,开始退币...");
currentState = State.RETURNING_COIN; // 改变状态到"退币"
} else {
System.out.println("没有正在进行的交易可取消。");
}
}
// 退币完成
public void coinReturned() {
// 从退币状态回到空闲状态
if (currentState == State.RETURNING_COIN) {
System.out.println("退币完成。");
currentState = State.IDLE;
} else {
System.out.println("没有正在进行的退币操作。");
}
}
}
(3)测试代码
最后,我们通过main方法来测试这个简单的状态机:
public static void main(String[] args) {
VendingMachine vm = new VendingMachine();
vm.insertCoin(); // 用户投币
vm.selectProduct(); // 用户选择商品
vm.cancel(); // 用户决定取消,应该退币
vm.coinReturned(); // 假设退币过程完成,通知机器
}
标签:状态,退币,java,示例,System,状态机,State,println,currentState From: https://blog.csdn.net/m0_60329232/article/details/139307387