在Java中,接口是一种特殊的存在,它体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各个模块之间的耦合,从而提高系统的可扩展性和可维护性。基于这种规则,很多软件架构设计理念都倡导“面向接口编程”,而不是面向实现类编程,下面介绍的命令模式则是面向接口编程的一种。
考虑这一场景,摸个方法需要完成一个行为,但是这个行为举行的实现逻辑无法确定,必须等到执行该方法的时候才能确定,这个时候我们就可以采取面向接口变成,即制定一个接口,通过不同的实现该接口的类,实现同一个方法的不同实现逻辑。这也体现了面向对象的三大特征之一,多态性。
假设一个需求,我们需要遍历某个数组,但是并不知道在遍历该数组时该如何处理这些元素。首先,我们定义接口,在该接口定义一个抽象方法用于处理一个数组。
public interface Command {
void process(int[] target);
}
接下来,有两个Java实现Command接口,在两个类中分别实现了process方法,处理了不同的业务逻辑。
//打印出数组中的每个元素
public class PrintCommand implements Command{
public void process(int[] target){
for(int tmp:target){
System.out.print(tmp);
}
System.out.println();
}
}
//对数组元素进行求和并输出
public class AddCommand implements Command {
public void process(int[] target){
int sum = 0;
for (int i = 0; i < target.length; i++) {
sum += target[i];
}
System.out.println(sum);
}
}
我们再定义个需要处理数组的处理类,在这个类中包含process方法,在该方法中无法确定数组的处理行为,因此在该方法传入一个Command参数,用于对数组的处理。
public class ProcessArray {
public void process(int[] target,Command cmd){
cmd.process(target);
}
}
最后创建测试类:
public class CommandTest {
public static void main(String[] args){
ProcessArray processArray = new ProcessArray();
int[] arr = {1,2,3,4,5,6,7};
processArray.process(arr,new PrintCommand());
processArray.process(arr,new AddCommand());
}
}
输出结果是:
1234567
28
我们可以看出,通过传入不同的实现Command接口的类作为参数,产生不同的效果,也就是process方法和具体行为的分离,这样设计的好处是降低程序各个模块之间的耦合度,是一种好的变成模式。