面向接口編程(二)
阿新 • • 發佈:2018-02-15
main pre target style field 規範 put log int
上一周我寫了采取簡單工廠模式的面向接口編程的方法,這周我來介紹另一種模式——命令模式。
我們或許會遇到這樣的問題,當某個方法要完成某一行為時,這個行為的具體實現無法實現確定,必須在調用這個方法時才可以確定,這種場景就是所謂的命令模式,但是Java並不能直接將方法體當參數傳入,這時我們就用到了面向接口編程的方式。
假如我們要定義一個處理數組的類ArrayHandler,但這是不知道具體怎麽處理,首先要有一個借口去定義數組處理方法(就是一個數組處理規範)
public interface Handler { public void handler(int target[]); }
定義ArrayHandler,我們只要將接口當做參數傳入即可
public class ArrayHandler { //Handler是處理數組的接口,利用Handler處理目標數組 public void handler(int target[],Handler hd){ hd.handler(target); }
//測試 public static void main(String[] args){ int[] target = {1,2,3,4,5,6,7,8,9,10,11}; ArrayHandler ah= new ArrayHandler(); ah.handler(target, new PrintArray()); ah.handler(target, new AddArray()); }
}
下面是AddArray和PrintArray的代碼,很簡單就可以實現,這樣就做到了讓ArrayHandler和處理行為分離。程序使用Handler接口代表對數組的處理,只有等到真正調用handler方法時
才確定對數組的處理行為。
public class AddArray implements Handler{ int sum = 0;public void handler(int[] target) { for(int index=0;index<target.length;index++){ sum += target[index]; } System.out.println("目標數組和為:" + sum); } }
public class PrintArray implements Handler{ public void handler(int[] target) { System.out.print("目標數組為:" + target[0] + " "); for(int index=1;index<target.length;index++){ if(index%10 !=0) System.out.print(target[index] + " "); else System.out.println(target[index] + " "); } } }
總結兩種面向接口編程的方式,區別就是簡單工廠模式是將方法行為規範單做成員變量傳入,以Computer與Output為例,Output是Computer的一個功能,這個功能是已知的,
就將Output當做Computer的一個Field。
而Handler對於ArrayHandler在調用之前是未知的,這時將Handler當做方法處理時的傳入參數,在調用這個方法時才能確定。
面向接口編程(二)