面向接口编程(二)

  上一周我写了采取简单工厂模式的面向接口编程的方法,这周我来介绍另一种模式——命令模式。

  我们或许会遇到这样的问题,当某个方法要完成某一行为时,这个行为的具体实现无法实现确定,必须在调用这个方法时才可以确定,这种场景就是所谓的命令模式,但是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当做方法处理时的传入参数,在调用这个方法时才能确定。

posted @ 2018-02-15 17:35  Shevo  阅读(159)  评论(0编辑  收藏  举报