GuessGame两个版本的区别

GuessGame 两个版本的区别分析


一、控制台输出

控制台版本的ConsoleGame是最基础、最传统的程序交互方式,它通过标准的输入输出流与用户进行通信。

  • 实现方式
    • 输入:使用java.util.Scanner类来读取用户在控制台(命令行窗口)中键入的文本。
    • 输出:使用 System.out.print()和 System.out.println()方法将文本直接打印到控制台上。
  • 代码特点
    // ConsoleGame.java
    @Override
    public void print(String text) {
        System.out.print(text); // 直接输出到控制台
    }
    @Override
    public void println(String text) {
        System.out.println(text); // 输出并换行
    }
    @Override
    public int nextInt() {
        return scanner.nextInt(); // 从控制台读取整数
    }
    
  • 用户体验
    • 界面为纯文本,没有图形元素。

    • 交互方式是“命令-响应”式,用户需要按照提示输入。

image


二、图形界面

图形界面版本GUIGame使用 Swing 组件库,通过弹出的对话框与用户进行交互,提供了更友好、舒适的用户体验。

  • 实现方式
    • 输入:使用 javax.swing.JOptionPane.showInputDialog() 方法弹出一个输入对话框,用户可以在文本框中输入内容。
    • 输出:使用 javax.swing.JOptionPane.showMessageDialog() 方法弹出一个消息对话框,向用户展示信息。
  • 代码特点
    // GUIGame.java
    @Override
    public void print(String text) {
        // 在对话框模式中,简单的print可以被忽略或整合到nextInt的提示中
    }
    @Override
    public void println(String text) {
        // 弹出消息对话框显示信息
        JOptionPane.showMessageDialog(null, text);
    }
    @Override
    public int nextInt() {
        // 弹出输入对话框获取用户输入
        String input = JOptionPane.showInputDialog(null, "请输入数字(0~9):");
        try {
            return Integer.parseInt(input);
        } catch (NumberFormatException e) {
            return -1; // 输入无效时返回一个特定值
        }
    }
    
  • 用户体验
    • 界面是图形化的窗口,包含按钮、文本框等元素。
    • 交互方式是点击和填写,对普通用户更直观、更友好。
    • 对话框是模态的,会强制用户处理当前任务,直到完成(猜对)。
      image
      image

2.1 抽象类的好处

在这个例子中,抽象类 GuessGame 是设计的核心,它带来了以下关键好处:

  1. 定义通用框架(模板方法模式)

    GuessGame 的 go() 方法定义了猜数字游戏的固定流程:生成随机数 -> 循环获取用户输入 -> 判断结果 -> 结束游戏。这个**算

法骨架**是固定不变的,而与用户交互的具体步骤(如何输入、如何输出)则被设计成抽象方法,由子类去实现。

  1. 实现代码复用

    游戏的核心逻辑(随机数生成、循环比较、胜负判断)只写在 GuessGame 中一次。如果没有抽象类,那么 ConsoleGame和

GUIGame 就需要各自实现一遍完全相同的游戏逻辑,造成代码冗余,当需要实现的东西太多,还会有可能造成漏写。

  1. 支持多态和扩展性

    我们可以这样写代码:

    GuessGame game = new ConsoleGame(); // 使用控制台版本
    // GuessGame game = new GUIGame();   // 使用图形界面版本
    game.go();
    

    这就是多态。程序的主体逻辑可以完全不知道具体是哪个版本,只管调用 go() 方法即可,隐藏了背后的逻辑。未来如果想实现其他版本,主程序几乎不需要修改。


三、两者对比

对比维度 ConsoleGame (控制台版) GUIGame (图形界面版)
交互媒介 文本流 图形窗口
依赖库 java.util.Scanner javax.swing.JOptionPane
输入方式 scanner.nextInt() JOptionPane.showInputDialog()
输出方式 System.out.println() JOptionPane.showMessageDialog()
用户体验 简洁、快速,适合技术用户 友好、直观,适合普通用户
实现复杂度 极低 低(Swing封装了复杂性)

四、总结

GuessGame 的两个版本(ConsoleGame 和 GUIGame),是面向对象设计思想的绝佳体现。它们虽然在外观和交互方式上截然不同,但其背后的游戏灵魂(核心逻辑)是完全一致的
这种设计的重点在于抽象方法。GuessGame抽象类成功地将“不变”的游戏逻辑与“多变”的界面实现分离开来,实现了多态。

posted @ 2025-10-25 23:57  穗和  阅读(3)  评论(0)    收藏  举报