如何使用状态设计模式实现这个 UML 图

问题描述 投票:0回答:1

enter image description here 我有这个 UML 图,想要使用状态设计模式来实现 InProgressState、HelpState 和 EscapeState。 详情如下:

  1. InProgressState:这是参与者的初始状态,参与者在解谜时保持在这个状态。
  • 在此状态下,solveRiddle 检查输入是否解决了当前谜语。
  1. HelpState:当参与者通过调用askForHelp方法请求帮助时,进入此状态。
  • 在这种状态下,无论提供什么输入,solveRiddle 都会解决谜语。 之后,如果还有剩余的谜题需要解决,参与者将转换回 InProgressState,否则将转换为 EscapedState。
  1. EscapedState:如果参与者成功解决了所有谜题,他们将转变为EscapedState。
  • 在这种状态下,如果调用solveRiddle,应该抛出RiddleException。

注:

  1. 如果谜语已被解决但再次作为参数传递给solveRiddle,则应抛出 RiddleException。
  2. 参与者可以一次选择任何一个谜语来解决。 solveRiddle 方法的参数whichRiddle 指示他/她向riddleList 中的哪个谜语提交输入。

我有一个名为 ParticipantState 的类:

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

我认为 InProgressState、HelpState 和 EscapedState 应该实现 ParticipantState,如下所示:

public class InProgressState implements ParticipantState{

    @Override
    public ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException {
        return this;
    }
}
java design-patterns
1个回答
0
投票

代码就像这样

public class HelpState implements ParticipantState{


@Override
public ParticipantState solveRiddle(String input, Riddle[] riddleList, int whichRiddle) throws RiddleException {
    Riddle riddle = riddleList[whichRiddle];
    if (riddle.isSolved())
        throw new RiddleException("Already Solved");

    riddle.setSolved();
    boolean isEsacped = true;
    for (Riddle item :
            riddleList) {
        if (item.isSolved() != true) {
            isEsacped = false;
            break;
        }
    }
    if (isEsacped)
        return new EscapedState();
    else
        return new InProgressState();
}

}

© www.soinside.com 2019 - 2024. All rights reserved.