第二十一條:函數對象表示策略

一、什麼是函數對象

①、類中只有唯一的一個方法,沒有成員變量。
②、該方法輸入參數是其他類。
③、內部邏輯是調用其他類的方法,完成某些任務。
示例:比較兩個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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章