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