如何使用状态设计模式实现指定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-
相关产品推荐
相关产品推荐

