Effective Java Item 21 note
Use function objects to represent strategies
Published in
2 min readJun 20, 2018
策略模式的定義是:
把演算法封裝起來,有相同的使用介面,當演算法更換,不會影響到使用演算法的使用方式。
在C可以用function pointer實作這樣的功能,本書著作的時候Java還沒有支援lambda的功能,所以用的是interface再加上object references來讓策略模式可行。
因為strategy class應該會是無狀態的,所以使用上你可以使用Singleton去包裝單一個特定功能的method,來減少多餘物件產生。(例子)
public class StrategySingleton {
private StrategySingleton() {}
public static final StrategySingleton INSTANCE = new StrategySingleton();
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
然後這樣的singleton是有固定object型別的,可以更近一步的定義個template,讓strategy更彈性。
然後要實例化的時候,你可以宣告成一個變數,也可以宣告成匿名class(這兩個方法每次使用的時候都會多出一個instance),可以把變數放在private static final然後命名來改善上面的用法。(例子)
private static final StrategyInterface<Integer> EXAMPLE = new IntComparator();
public interface StrategyInterface<T> {
public int compare(T t1, T t2);
}
static class IntComparator implements StrategyInterface<Integer> {
@Override
public int compare(Integer i1, Integer i2) {
return i1 - i2;
}
}
然後Java 8導入了lambda,對於item19跟21都有些不太一樣的影響。需要放另一個筆記再去討論這件事情。