Java OOP优化代码

时间:2013-05-27 22:26:21

标签: java oop inheritance polymorphism code-duplication

我正在进行我的Java任务 - 扫雷游戏克隆。我有两个几乎相同的(只有文本标签和文本框架不同)方法gameWon()和gameLost(),它们负责在游戏结束时显示“Game Won!”/“Game Lost”窗口。我知道代码重复是不好的做法所以我想优化它。问题是我对OOP有点新意,我不确定该怎么做。也许我可以将这些方法合并为一种,以便在不同的情况下以不同的方式行动,或者继承可能是有用的。我真的不知道,希望你们中的一些人可以帮我一点。谢谢你的回答。

以下是这些方法的代码:

GAMEOVER

public static void gameOver() {

        F1 = new JFrame("Game Over"); 
        F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

        F1.setSize(360, 120);
        Container content = F1.getContentPane();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout()); 

        JLabel textLabel = new JLabel("Sorry, you have lost this game! Better luck next time.",SwingConstants.CENTER); 
        textLabel.setPreferredSize(new Dimension(360, 40));
        content.add(textLabel, BorderLayout.CENTER);

        JButton button = new JButton("Exit");
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        }); 
        content.add(button);

        button = new JButton("Restart This Game");  
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                F1.dispose();
                Board.doRepaint();
            }
        });         
        content.add(button);

        button = new JButton("Play Again"); 
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                F1.dispose();
                restartGame();
            }
        });         
        content.add(button);

        F1.setLocationRelativeTo(null);
        F1.setVisible(true); 
    }

gameWon

public static void gameWon() {  
   F1 = new JFrame("Game Won"); 
   F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

   F1.setSize(360, 120);
   Container content = F1.getContentPane();
   content.setBackground(Color.white);
   content.setLayout(new FlowLayout()); 

   JLabel textLabel = new JLabel("Congratulations, you have won the game!",SwingConstants.CENTER); 
   textLabel.setPreferredSize(new Dimension(360, 40));
   content.add(textLabel, BorderLayout.CENTER);

   JButton button = new JButton("Exit");
   button.addActionListener(new ActionListener() {

     public void actionPerformed(ActionEvent e)
     {
        System.exit(0);
     }
  }); 
  content.add(button);

  button = new JButton("Restart This Game");    
  button.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        F1.dispose();
        Board.doRepaint();
    }
  });       
  content.add(button);

  button = new JButton("Play Again");   
  button.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
        F1.dispose();
        restartGame();
    }
  });       
  content.add(button);

  F1.setLocationRelativeTo(null);
  F1.setVisible(true); 
}

4 个答案:

答案 0 :(得分:1)

您应该只有一种方法,称之为gameOver(....),乍一看,您只需要两个参数titlemessage。然后,只更改两行代码:

public static void gameOver(final String title, final String message) {
  .....
  F1 = new JFrame(title);
  .....
  JLabel textLabel = new JLabel(message ,SwingConstants.CENTER);
}

然后,不是调用两个方法,而是使用不同的参数调用相同的方法:

gameOver("Game Won", "Congratulations, you have won the game!");

答案 1 :(得分:1)

你可以做的最简单的事情是将标题和消息的字符串作为参数,或者通过获取一个布尔参数来表示游戏是否已经获胜并且在方法中设置布尔测试设置字符串,例如:

public static void gameOver(boolean won) {
    ....
    F1 = new JFrame(won?"Game Won":"Game Over");
    ....
}

答案 2 :(得分:0)

public static void gameEnd(boolean hasWon) {

    String title = hasWon ? "Game Won" : "Game Over";
    F1 = new JFrame(title); 
    F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    F1.setSize(360, 120);
    Container content = F1.getContentPane();
    content.setBackground(Color.white);
    content.setLayout(new FlowLayout()); 

    String message = hasWon ? "Congratulations, you have won the game!" :
          "Sorry, you have lost this game! Better luck next time.";
    JLabel textLabel = new JLabel(message,SwingConstants.CENTER);
    textLabel.setPreferredSize(new Dimension(360, 40));
    content.add(textLabel, BorderLayout.CENTER);

    JButton button = new JButton("Exit");
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    }); 
    content.add(button);

    button = new JButton("Restart This Game");  
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            F1.dispose();
            Board.doRepaint();
        }
    });         
    content.add(button);

    button = new JButton("Play Again"); 
    button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            F1.dispose();
            restartGame();
        }
    });         
    content.add(button);

    F1.setLocationRelativeTo(null);
    F1.setVisible(true); 
}

答案 3 :(得分:0)

仔细观察代码,仅仅按照其他答案中的建议传递布尔值或字符串参数是不够的。您需要做的工作是识别所有(此处:两个)方法的常见代码和不同代码。在你的情况下,我想出了这个:

  • 标题
  • 消息
  • 按钮1消息
  • 按钮1听众
  • 按钮2消息
  • 按钮2监听器

    public static void showTwoButtonMessage(String title, String message,
     String button1Message, ActionListener listener1,
     String button2Message, ActionListener listener2){
    //...
    }
    

因此,你有一个简洁的方法,你可以重复使用来显示任何两个按钮窗口。