在JAVA中应用MVC概念

时间:2011-02-19 14:18:53

标签: java

美好的一天!

关于我的previous post,为了适应建议的MVC概念,我改变了我的代码并包含了一个IO类,如下所示:

  public class IO {
        public void output(String msg) {
            JOptionPane.showMessageDialog(null, msg);
        }

        public String input(String prompt) {
            return JOptionPane.showInputDialog(prompt);
        }

        public int inputInt(String prompt) {
            return Integer.parseInt(input(prompt));
        }
    }


   public class GuessGame {

    private int numberToGuess;
    private ArrayList<Player> player;
    private IO io = new IO ();

    public void acceptPlayers(){
        int num_players = io.inputInt("Enter number of players");  
        player = new ArrayList<Player>(num_players);
        for (int i = 0; i < num_players; i++) {
            player.add(new Player(io.input("Enter Player " + (i+1) + " Name: ")));
        }
    }

    public void startGame() {
        numberToGuess = (int) (Math.random() * 10);
        while (true) {
            for (Player curPlayer : player) {
                if (curPlayer.guessNumber() == numberToGuess) {
                    declareWinner(curPlayer);
                    return;
                }
                io.output(curPlayer.getPlayerName() + "'s Guess is Wrong!");
            }
        }
    }

    private void declareWinner(Player player) {
        io.output(player.getPlayerName() + " Wins!");
    }
}

这是对的吗?我该如何改进我的代码?谢谢。

2 个答案:

答案 0 :(得分:2)

IO类在MVC模型中支持您的View。

GuessGame类必须承担很多责任,这个类适合你的模型和控制器,你必须拆分它。

您可以创建一个游戏类,其状态为 numberToGuess ArrayList player ; 对于方法 addPlayer() start()

你可以拥有一个GameControlled类,它具有状态IO类和Game类。 对于方法 acceptPlayers(),* startGame()*, declareWinner(播放器播放器)

答案 1 :(得分:1)

在上面的代码中,您无法将视图i.IO从图形界面更改为命令行界面。 如果将IO更改为接口,并将GraphicalIO类更改为显示图形界面,将另一个类CommandLineIO更改为显示命令行界面,则可以充分利用OOP概念。

另外关于MVC模式如果你把IO用于生成视图而GuessGame作为模型和控制器,因为它具有逻辑和程序控制,它仍然没有干净地分开。猜测游戏紧密耦合到IO对象再次与图形视图紧密耦合。