You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用状态设计模式实现指定UML图中的三种参与者状态类

状态设计模式实现方案

状态定义与行为要求

  • InProgressState:参与者初始状态,解谜过程中保持该状态
    • 调用solveRiddle方法时,检查输入是否能解开指定谜题
  • HelpState:参与者调用askForHelp请求帮助时进入该状态
    • 调用solveRiddle方法时,无论输入内容如何,直接解开指定谜题;操作完成后,若仍有未解决谜题则转回InProgressState,否则转入EscapedState
  • EscapedState:成功解开所有谜题后转入该状态
    • 调用solveRiddle方法时抛出RiddleException异常

通用约束

  • 若已解决的谜题被再次传入solveRiddle方法,需抛出RiddleException异常
  • 参与者可选择任意谜题解答,solveRiddle方法的whichRiddle参数指定riddleList中对应的谜题索引

已有接口定义

public interface ParticipantState {
    ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException;
}

状态类具体实现

InProgressState 实现

public class InProgressState implements ParticipantState {

    @Override
    public ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException {
        // 校验谜题索引合法性
        if (whichRiddle < 0 || whichRiddle >= riddleList.length) {
            throw new RiddleException("无效的谜题索引");
        }
        
        Riddle targetRiddle = riddleList[whichRiddle];
        
        // 校验谜题是否已解决
        if (targetRiddle.isSolved()) {
            throw new RiddleException("该谜题已解决");
        }
        
        // 检查输入是否匹配正确答案
        if (targetRiddle.checkAnswer(input)) {
            targetRiddle.markAsSolved();
            // 检查是否所有谜题均已解决
            boolean allSolved = true;
            for (Riddle riddle : riddleList) {
                if (!riddle.isSolved()) {
                    allSolved = false;
                    break;
                }
            }
            return allSolved ? new EscapedState() : this;
        }
        
        // 输入错误,保持当前状态
        return this;
    }
}

HelpState 实现

public class HelpState implements ParticipantState {

    @Override
    public ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException {
        // 校验谜题索引合法性
        if (whichRiddle < 0 || whichRiddle >= riddleList.length) {
            throw new RiddleException("无效的谜题索引");
        }
        
        Riddle targetRiddle = riddleList[whichRiddle];
        
        // 校验谜题是否已解决
        if (targetRiddle.isSolved()) {
            throw new RiddleException("该谜题已解决");
        }
        
        // 直接标记谜题为已解决
        targetRiddle.markAsSolved();
        
        // 检查是否所有谜题均已解决
        boolean allSolved = true;
        for (Riddle riddle : riddleList) {
            if (!riddle.isSolved()) {
                allSolved = false;
                break;
            }
        }
        
        // 根据剩余谜题状态切换对应状态
        return allSolved ? new EscapedState() : new InProgressState();
    }
}

EscapedState 实现

public class EscapedState implements ParticipantState {

    @Override
    public ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException {
        throw new RiddleException("所有谜题已解决,无法继续执行解谜操作");
    }
}

补充说明

上述实现基于Riddle类包含以下核心方法的假设:

  • boolean checkAnswer(String input):校验输入是否为谜题正确答案
  • void markAsSolved():将谜题标记为已解决状态
  • boolean isSolved():判断谜题是否已被解决

内容的提问来源于stack exchange,提问作者Valenciaaa-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:44:56