有没有办法限制'可以根据程序的当前状态在类上调用的方法?

时间:2015-06-26 19:59:38

标签: oop design-patterns

说我正在开发一款非常简单的纸牌游戏。纸牌游戏分为两个阶段。

第一阶段:Everone依次抽出一张卡片。 第二阶段:每个人按顺序播放一张卡片。

所以,我用一个看起来像这样的api来模拟游戏:

public class Game {
    public void draw(PlayerId playerId) {
        Player player = players.get(playerId);
        player.drawFrom(drawDeck);
    }

    public void play(PlayerId playerId, CardId cardId) {
        Player player = players.get(playerId);
        player.playCard(cardId);
    }
}

这是我的问题:Game类有两种方法可以调用,但只有一种方法在任何一个特定时间都有效。如果游戏处于第一阶段,则不应调用方法play。同样,如果游戏处于第二阶段,则不应调用方法draw

在这种情况下,我有哪些选择?我只能考虑在不应该调用方法的情况下抛出异常。

理想情况下,我希望客户端代码只能调用在该特定时间有效的方法。有关如何做到这一点的任何想法?或者,客户有责任正确调用方法吗?

3 个答案:

答案 0 :(得分:2)

Strategy design pattern可以在这里提供帮助。使用GameGamePhase1实现定义GamePhase2界面。

public interface Game {
    public boolean isDrawAllowed();
    public boolean isPlayAllowed();
    public void draw(...);
    public void play(...);
}

每个实现都会为游戏阶段返回相应的布尔值。无效的绘制或播放方法可能会抛出异常。随着游戏阶段的变化,管理代码将交换正确的实现。检查is...方法可以避免遇到异常并允许UI选择要显示的选项。

答案 1 :(得分:1)

您应该使用状态模式并将接口分成2个单独的DrawPhasePlayPhase,其中每个只有一个有效的方法。然后,您的游戏类可以根据您正在实施的游戏规则更改它的相位。

答案 2 :(得分:0)

您可以使用异常处理,但也可以使用if语句并打印消息。

我认为这个游戏有一个客户端服务器模型,并且您担心有人可能会修改他们的客户端以尝试做不适当的操作。我会在调用你所描述的方法的方法中处理这个问题:

public class Main {
    public void takeNextTurn(PlayerId playerId, int action)
      if(action == 0){
         if (appropriate_to_draw){
            game.draw(playerid);
         }
         else {
            messageClient("You can't draw now");
         }
         ...
      }
   }

在您的客户端中,请确保处理此消息。