上一周我写了采取简单工厂模式的面向接口编程的方法,这周我来介绍另一种模式——命令模式。
我们或许会遇到这样的问题,当某个方法要完成某一行为时,这个行为的具体实现无法实现确定,必须在调用这个方法时才可以确定,这种场景就是所谓的命令模式,但是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当做方法处理时的传入参数,在调用这个方法时才能确定。