【问题标题】:Is there any way to 'limit' the methods that can be called on a class depending on the current state of a program?有没有办法根据程序的当前状态“限制”可以在类上调用的方法?
【发布时间】:2015-06-26 19:59:38
【问题描述】:

假设我正在开发一个非常简单的纸牌游戏。纸牌游戏有两个阶段。

第一阶段: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

在这种情况下我有什么选择?我只能考虑在不应该调用方法时抛出异常。

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

【问题讨论】:

    标签: oop design-patterns


    【解决方案1】:

    Strategy design pattern 可以在这里提供帮助。使用GamePhase1GamePhase2 实现定义Game 接口。

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

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

    【讨论】:

      【解决方案2】:

      您应该使用状态模式并将接口分成两个独立的DrawPhasePlayPhase,每个只有一个有效的方法。然后,您的 Game 类可以根据您正在实施的游戏规则更改其所处的阶段。

      【讨论】:

      • 我想到了状态模式,但这里唯一的问题是状态必须具有相同的接口。通常这是可取的,但我认为它不适用于我的特定情况,还是我错过了什么?
      • 它不必具有相同的界面。每个状态都可以(应该)有额外的方法。
      【解决方案3】:

      您可以使用异常处理,但也可以只使用 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");
               }
               ...
            }
         }
      

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

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 2020-12-04
        相关资源
        最近更新 更多