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

Java 面向對象實戰:用介面、多態、繼承計算幾何圖形面積周長

     編輯:Java 相關知識

「介面隔離、多態替換、繼承復用」是物件導向三大支柱。本文通過一個計算三角形與矩形面積/周長的完整案例,示範如何將這三大機制有機結合,構建可擴展的幾何計算體系。

領域建模

public interface Shape {
    double area();      // 面積
    double perimeter(); // 周長
}

三角形實現(含合法性驗證)

public class Triangle implements Shape {
    private final double a, b, c;
    public Triangle(double a, double b, double c) {
        if (!isValid(a, b, c))
            throw new IllegalArgumentException("邊長無法構成三角形");
        this.a = a; this.b = b; this.c = c;
    }
    private boolean isValid(double a, double b, double c) {
        return a + b > c && a + c > b && b + c > a;
    }
    @Override public double perimeter() { return a + b + c; }
    @Override public double area() {
        double p = perimeter() / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c)); // 海倫公式
    }
}

矩形實現

public class Rectangle implements Shape {
    private final double width, height;
    public Rectangle(double width, double height) {
        this.width = width; this.height = height;
    }
    @Override public double perimeter() { return 2 * (width + height); }
    @Override public double area() { return width * height; }
}

客戶端多態調用

public class GeometryDemo {
    public static void main(String[] args) {
        Shape[] shapes = {
            new Triangle(3, 4, 5),
            new Rectangle(10, 20),
            new Triangle(6, 8, 10)
        };
        for (Shape s : shapes) {
            System.out.printf("%s: 面積=%.2f, 周長=%.2f%n",
                s.getClass().getSimpleName(), s.area(), s.perimeter());
        }
        // 輸出:
        // Triangle: 面積=6.00, 周長=12.00
        // Rectangle: 面積=200.00, 周長=60.00
        // Triangle: 面積=24.00, 周長=24.00
    }
}

設計亮點解析

  1. 介面定義契約:強制所有圖形實現 area/perimeter,編譯期保證
  2. 建構子驗證:Triangle 在創建時即檢查三角不等式,失敗快原則
  3. 不可變對象:邊長為 final,執行緒安全,適合並發環境
  4. 開閉原則:新增圖形(如圓形)只需新增類實現 Shape,無需修改現有代碼
  5. 里氏替換:客戶端針對 Shape 介面編程,可透明替換具體實現

擴展練習

  • 引入 Comparable<Shape> 按面積排序
  • 用 Stream API 計算總面積:Arrays.stream(shapes).mapToDouble(Shape::area).sum()
  • 加入 Visitor 模式支援導出 SVG/JSON 等多種格式

總結

這個小案例浓縮了「面向介面編程、封裝驗證、不可變設計、多態分發、開閉原則」五大核心技能。實際專案中,將業務規則封裝在領域模型建構子中,配合介面驅動架構,能顯著降低耦合、提升可測試性與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved