GuessGame 两个版本的区别分析
目录
- GuessGame 两个版本的区别分析
- 一、控制台输出
- 二、图形界面
- 2.1 抽象类的好处
- 三、两者对比
- 四、总结
- 一、控制台输出
一、控制台输出
控制台版本的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(); // 从控制台读取整数 } - 用户体验:
-
界面为纯文本,没有图形元素。
-
交互方式是“命令-响应”式,用户需要按照提示输入。
-

二、图形界面
图形界面版本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 是设计的核心,它带来了以下关键好处:
-
定义通用框架(模板方法模式):
GuessGame 的 go() 方法定义了猜数字游戏的固定流程:生成随机数 -> 循环获取用户输入 -> 判断结果 -> 结束游戏。这个**算
法骨架**是固定不变的,而与用户交互的具体步骤(如何输入、如何输出)则被设计成抽象方法,由子类去实现。
-
实现代码复用:
游戏的核心逻辑(随机数生成、循环比较、胜负判断)只写在 GuessGame 中一次。如果没有抽象类,那么 ConsoleGame和
GUIGame 就需要各自实现一遍完全相同的游戏逻辑,造成代码冗余,当需要实现的东西太多,还会有可能造成漏写。
-
支持多态和扩展性:
我们可以这样写代码:
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抽象类成功地将“不变”的游戏逻辑与“多变”的界面实现分离开来,实现了多态。


