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

Effective Java 策略模式實踐:用函數對象替代函數指針

     編輯:Java 綜合教學

策略模式在 Java 中的實現之道

C/C++ 通過函數指針傳遞行為,Java 無指針機制,但可用函數對象(Function Object)實現同樣效果:定義一個類,其實例方法封裝具體演算法,再將實例作為參數傳遞。

從具體策略到策略接口

步驟 1:具體策略類

class StringLengthComparator {
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
}

步驟 2:單例優化(無狀態策略)

public class StringLengthComparator implements Comparator<String> {
    private StringLengthComparator() {}
    public static final StringLengthComparator INSTANCE = new StringLengthComparator();
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
}

步驟 3:定義策略接口(Java 已內建 java.util.Comparator<T>)

public interface Comparator<T> {
    int compare(T t1, T t2);
}

三種使用場景與最佳實踐

場景寫法優缺點
一次性使用匿名類
Arrays.sort(arr, new Comparator<>() {...})
簡潔但每次調用創建新實例
重複使用、無序列化需求私有靜態成員類 + 公開靜態 final 域
private static class StrLenCmp implements Comparator<String> {...}
單例複用、命名清晰、可實現多接口
需序列化/跨進程傳遞成員類實現 Serializable保持策略對象可序列化

宿主類導出策略範例

public class Host {
    private static class StrLenCmp implements Comparator<String>, Serializable {
        public int compare(String s1, String s2) { return s1.length() - s2.length(); }
    }
    public static final Comparator<String> STRING_LENGTH_COMPARATOR = new StrLenCmp();
}

要點:策略接口作為類型參數,具體策略類封裝於宿主類內部,對外僅暴露接口類型常量,體現「封裝變化」原則。

總結

Java 中實現策略模式:聲明策略接口 → 實現具體策略類 → 以接口類型傳遞/持有。一次性用匿名類,重用用私有靜態成員類 + 公開常量導出。這正是 String.CASE_INSENSITIVE_ORDER 等標準庫的實現方式。

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