如果一個對象的方法執行其他對象的操作,一個類僅僅導出這個方法(它的實例相當于一個指向該方法的指針),這樣的實例被稱為函數對象 例如: /** * 如果一個類的所有實例在功能上都是相互等價的,那么他應該被設計為一個singleton
public class StringLengthComparator { PRivate StringLengthComparator() { } public static final StringLengthComparator INSTANCE = new StringLengthComparator(); public int compare(String s1, String s2) { return s1.length() - s2.length(); }}//策略接口
public interface Comparator<T> { public int compare(T s1,T s2);}/** * 如果使用匿名雷勝明,將會在每次執行調用的時候創建一個新的實例.應該講函數對象儲存在一個私有的靜態域final里面并重用它 * @author JacXuan * */
public class Host {// //使用匿名內部類// Arrays.sort(StringArray,new Comparator<String>(){// public int compare(String s1,String s2){// return s1.length()-s2.length();// }// }) private static class StrlenCmp implements Comparator<String>,Serializable{ @Override public int compare(String s1, String s2) { return s1.length()-s2.length(); } } public static final Comparator<String> STRING_LENGTH_COMPARATOR = new StrlenCmp();}總結:函數指針的只要用途就是實現策略模式. 在java中實現這種模式,首先要聲明一個接口來表示該策略,并且為每個具體策略聲明一個實現了該接口的類.當一個具體策略只被調用一次的時候,通常使用匿名類來聲明和實例化這個具體的實現類.當一個具體策略是設計用來重復使用的時候,它的類通常就要被實現為私有的靜態成員類,并通過公有的靜態final域被導出,其類型為該策略接口
|
新聞熱點
疑難解答