首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 計算器實現四種經典模式:Swing GUI、AWT、控制台與命令模式

     編輯:Java 相關知識

模式一:Swing 圖形界面計算器(完整 MVC)

採用 GridBagLayout 精確佈局,按鈕事件分離為數字輸入與運算命令兩類監聽器。

public class SwingCalculator extends JFrame {
    private JTextField display;
    private double result = 0;
    private String lastOp = "=";
    private boolean start = true;

    public SwingCalculator() {
        setTitle("計算器"); setDefaultCloseOperation(EXIT_ON_CLOSE);
        display = new JTextField(20); display.setHorizontalAlignment(JTextField.RIGHT);
        // 佈局代碼省略... 關鍵邏輯如下:
    }

    private class NumberAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String input = e.getActionCommand();
            if (start) { display.setText(""); start = false; }
            if (!input.equals("←")) display.setText(display.getText() + input);
            else { /* 退格邏輯 */ }
        }
    }

    private class OperatorAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String op = e.getActionCommand();
            if (!start) calculate(Double.parseDouble(display.getText()));
            lastOp = op; start = true;
        }
    }

    private void calculate(double x) {
        switch (lastOp) {
            case "+": result += x; break;
            case "-": result -= x; break;
            case "*": result *= x; break;
            case "/": result = (x != 0) ? result / x : 0; break;
            case "=": result = x; break;
        }
        display.setText(String.valueOf(result));
    }
}

模式二:AWT 簡易計算器

使用 Frame、Panel、GridLayout,成員內部類實現監聽器,邏輯與 Swing 版本相似但組件更輕量。

模式三:控制台交互計算器

public class ConsoleCalculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("1.加 2.減 3.乘 4.除 0.退出");
            int op = sc.nextInt(); if (op == 0) break;
            System.out.print("運算元1: "); double a = sc.nextDouble();
            System.out.print("運算元2: "); double b = sc.nextDouble();
            double r = switch (op) {
                case 1 -> a + b; case 2 -> a - b;
                case 3 -> a * b; case 4 -> b != 0 ? a / b : Double.NaN;
                default -> Double.NaN;
            };
            System.out.printf("結果: %.2f%n%n", r);
        }
    }
}

模式四:命令模式解耦運算邏輯(擴展性最強)

// 命令介面
interface Command { double execute(double a, double b); }

// 具體命令
class AddCmd implements Command { public double execute(double a, double b) { return a + b; } }
class SubCmd implements Command { public double execute(double a, double b) { return a - b; } }
class MulCmd implements Command { public double execute(double a, double b) { return a * b; } }
class DivCmd implements Command { public double execute(double a, double b) { return b != 0 ? a / b : Double.NaN; } }

// 工廠
class CommandFactory {
    private static final Map MAP = Map.of(
        "+", new AddCmd(), "-", new SubCmd(),
        "*", new MulCmd(), "/", new DivCmd()
    );
    public static Command get(String op) { return MAP.get(op); }
}

// 使用
public class CommandCalculator {
    private double memory = 0;
    public double compute(double a, String op, double b) {
        Command cmd = CommandFactory.get(op);
        if (cmd == null) throw new IllegalArgumentException("未知運算符: " + op);
        memory = cmd.execute(a, b);
        return memory;
    }
}

架構對比總結

模式適用場景優點缺點
Swing GUI桌面應用原生跨平台、功能豐富代碼冗長、界面風格較舊
AWT教學/極簡工具無依賴、啟動快外觀原生、功能受限
控制台腳本/測試/服務端零依賴、易自動化無圖形界面
命令模式科學計算器/規則引擎開閉原則、易擴展運算符初期結構較複雜

進階擴展建議

  • 表達式解析:引入 exp4j 或 Javaluator 支援括號、函數、優先級
  • 歷史記錄:命令模式天然支援 Undo/Redo(保存命令對象棧)
  • 鍵盤綁定:Swing 中用 InputMap/ActionMap 綁定數字鍵、Enter、Esc
  • 現代 UI:考慮 JavaFX (FXML + Controller) 或 Web 前端 + Spring Boot 後端
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved