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

提升 Java 代碼復用性的三大重構策略:從繼承到組合、從類到接口

     編輯:Java 相關知識

代碼復用是軟件工程永恆追求。但盲目使用繼承往往導致脆弱的層級結構。本文提出三大重構策略,引導你從「繼承復用」轉向「組合復用」,從「依賴具體類」轉向「依賴接口」,構建高內聚、低耦合、高復用的代碼庫。

策略一:將實例方法重構為靜態工具方法(職能分離)

繼承復用的弊端

  • 「是一種」關係脆弱:子類繼承父類所有方法,即使只需要其中一個
  • 耦合父類實現細節:父類修改波及所有子類
  • 方法覆蓋語義模糊:是否調用 super?調用順序?極易出錯

重構前:臃腫的 Polygon 類

class Polygon {
    public int getPerimeter() { ... }
    public boolean isConvex() { ... }
    public boolean containsPoint(Point p) { ... }
    // 客戶代碼若只需 containsPoint,仍被迫繼承整個類
}

重構後:職能類 + 靜態方法

class Polygon {
    public int getPerimeter() { return pPolygon.computePerimeter(this); }
    public boolean isConvex() { return pPolygon.isConvex(this); }
    public boolean containsPoint(Point p) { return pPolygon.containsPoint(this, p); }
}

// 職能類:名稱以小寫 p 開頭,標識純靜態工具類
class pPolygon {
    static public int computePerimeter(Polygon polygon) { ... }
    static public boolean isConvex(Polygon polygon) { ... }
    static public boolean containsPoint(Polygon polygon, Point p) { ... }
}

核心收益

  • 按需依賴:客戶代碼只調用需要的靜態方法,無繼承負擔
  • 無副作用:靜態方法只依賴參數,不依賴外部狀態,極易測試
  • 多態保留:Polygon 仍可作為數據載體,pPolygon 提供算法實現

策略二:參數類型從具體類改為接口(多態參數化)

Allen Holub 金句

「我們通過對接口而非類編程達到代碼復用。若方法所有參數都是接口引用,它就能操作編寫代碼時尚不存在的對象類型。可復用的是方法,而非傳入的對象。」

重構示例


// 改前:綁定 Rectangle 具體類
static public boolean contains(Rectangle rect, int x, int y) { ... }

// 改後:依賴 Rectangular 接口
static public boolean contains(Rectangular rect, int x, int y) { ... }

interface Rectangular { Rectangle getBounds(); }

集合場景的威力

// 檢查集合中任意矩形是否重疊
static public boolean areAnyOverlapping(Collection rects) {
    for (Rectangular r : rects) { // 多態遍歷
        Rectangle bounds = r.getBounds();
        // 重疊檢測邏輯...
    }
}

若參數為 Collection,則只能處理 Rectangle 及其子類。接口參數使方法能處理所有實現 Rectangular 的類型(Ellipse、Polygon、自定義形狀等),復用性指數級提升。

策略三:選擇最小完備接口(接口隔離原則)

原則

參數接口應恰好滿足方法需求,越小越好。接口越小,實現類越多,方法適用面越廣。

重構示例


// 改前:Window 接口過大,包含標題、圖標、事件等無關方法
static public boolean areOverlapping(Window w1, Window w2) { ... }

// 改後:只需矩形邊界信息
static public boolean areOverlapping(Rectangular r1, Rectangular r2) { ... }

策略模式的接口設計

// 排序比較器:只需一個比較方法
static public void sort(List list, SortComparison comp) { ... }

interface SortComparison {
    boolean comesBefore(Object a, Object b); // 單一職責接口
}

SortComparison 專為 sort 服務,不可復用於其他場景——這正是「最小完備」的體現。

三大策略綜合對比

策略核心手段解決問題適用場景
方法靜態化實例方法 → 靜態工具方法繼承耦合、職能混雜工具算法、無狀態計算、通用邏輯
參數接口化具體類參數 → 接口參數類型綁定、擴展受限集合處理、多態算法、框架擴展點
最小接口大接口 → 最小職責接口接口膨脹、實現困難策略模式、回調、框架 SPI

避坑指南

  • 表現層代碼勿強求復用:UI 佈局、事件綁定高度業務相關,復用 ROI 極低
  • 保留領域模型豐富行為:核心領域對象(如 Order、Account)應保持豐富模型,策略適用於服務層/工具層
  • 接口設計需預見變化:接口一旦發布難以修改,需平衡「最小」與「穩定」

總結

三大策略構成「現代 Java 復用鐵三角」:靜態方法分離職能、接口參數實現多態、最小接口最大化適用面。這不是拒絕 OOP,而是在恰當層次應用恰當抽象——數據用類封裝,行為用接口參數化,算法用靜態方法組合。如此代碼,歷久彌新。

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