一、什麼是函數對象
①、類中只有唯一的一個方法,沒有成員變量。
②、該方法輸入參數是其他類。
③、內部邏輯是調用其他類的方法,完成某些任務。
示例:比較兩個String對象的長度。
public class StrLenCompare{
public int compare(String first,String second){
return first.length - second.length;
}
}
這就是一個簡單的函數對象。該類就是指向該方法的指針。 - -
那麼我們可以創建多種比較方式的類(比較字符串的大小,首字母大小等)。這就形成了策略模式的雛形。
二、優化函數對象
將其作爲單例(Singleton)模式
public class StrLenCompare {
private StrLenCompare(){};
//設置爲公共的不可變成員變量
public static final StrLenCompare STR_LEN_COMPARE = new StrLenCompare();
public int compare(String first,String second){
return first.length() - second.length();
}
}
如果其他類想使用其他的Compare方法的話,就必須得有一個接口,作爲Compare類的父類。
所以說我們,需要先創建一個Compare接口
public interface Comparable<T>{
int comparable (T a,Tb);
}
然後讓StrLenCompare繼承該接口public class StrLenCompare implements Compareble<String>{
private StrLenCompare() {
// TODO Auto-generated constructor stub
}
public static final StrLenCompare STR_LEN_COMPARE = new StrLenCompare();
@Override
public int comparable(String a, String b) {
// TODO Auto-generated method stub
return a.length() - b.length();
}
}
使用:public class StringTest {
private String s1;
private String s2;
public StringTest(String s1,String s2) {
// TODO Auto-generated constructor stub
this.s1 = s1;
this.s2 = s2;
}
//這樣就能傳入不同的Compareble對象比較兩個字符串了
public void compare(Compareble<String> compare){
compare.comparable(s1, s2);
}
}
總結:策略模式
①、需要有個一共同的策略接口
②、具體策略繼承該策略接口
③、當該具體策略只被使用一次的使用,一般都使用匿名類來創建
④、當被某個類使用多次的時候,就需要將該具體策略設爲該類私有的,並設置靜態常量讓其導出
⑤、當被多個類重複使用的時候,將該具體策略設置爲Singleton