场景
有个方法需要遍历某个数组的数组元素,但是无法确定是全部加起来,还是依次打印,需要在调用该方法时,指定具体的处理行为。
例如:前台传给我一个命令 add
,我就对数组执行相加求和,如果前台只是传给我 print
,就依次打印数组中的元素。
定义接口和实现类
接口
public interface Command {
void process(int[] target);
}
两个实现类
public class AddCommand implements Command {
@Override
public void process(int[] target) {
int sum = 0;
for(int tmp:target){
sum += tmp;
}
System.out.println("数组元素的总和是:" + sum);
}
}
public class PrintCommand implements Command{
@Override
public void process(int[] target) {
for(int tmp:target){
System.out.println("迭代输出目标数组的元素:" + tmp);
}
}
}
需要处理数组的处理类
public class ProcessArray {
/**
* 因为这个方法无法确定处理数组的处理行为,
* 因为现在还无法确定这个处理行为,所以定义该方法时使用了一个 Command 参数,
* 这个 Command 参数负责对数组的处理行为。
* 将方法的参数其中之一,设置为接口
* @param target
* @param command
*/
public void process(int[] target,Command command){
command.process(target);
}
}
测试类
public class CommandTest {
public static void main(String[] args) {
ProcessArray processArray = new ProcessArray();
int[] target = new int[]{1, 23, 4};
Command printCommand = new PrintCommand();
processArray.process(target,printCommand);
Command addCommand = new AddCommand();
processArray.process(target,addCommand);
}
}
我们还可以使用匿名内部类的语法来完成测试类的编写:
public class CommandTest {
public static void main(String[] args) {
ProcessArray processArray = new ProcessArray();
int[] target = new int[]{1, 23, 4};
processArray.process(target, new Command() {
@Override
public void process(int[] target) {
for(int tmp:target){
System.out.println("遍历输出:" + tmp);
}
}
});
processArray.process(target, new Command() {
@Override
public void process(int[] target) {
int sum = 0;
for(int tmp:target){
sum += tmp;
}
System.out.println("计算数组的和:" + sum);
}
});
}
}