考虑这样一种场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。
具体一点:假设有一个方法是遍历某个数组的数组元素,但是无法确定在遍历的数组的元素的时候如何处理这些元素,需要在调用该方法时指定具体的处理行为。
这时可以采用命令模式---即将“处理行为”作为一个参数传入该方法。
具体实现如下:
1》用一个Command接口来定义一下方法,在这个方法里封装“处理行为”
该Command接口代码如下:
package com.demo.command;
public interface Command {
//接口里定义的process方法用于封装“处理形为”
void process(int [] target);
}
2》定义遍历数组的方法,并将“处理行为”作为参数传入其中
ProcessArray代码如下:
package com.demo.command;
public class ProcessArray {
public void process(int [] target,Command command){
//在这里调用具体的“处理行为”处理数组
command.process(target);
}
}
3》实现具体的“处理行为”类,即实现Command接口
3.1》实现一个打印输入该数组元素的“处理行为”类PrintCommand
package com.demo.command;
public class PrintCommand implements Command{
@Override
public void process(int[] target) {
// TODO Auto-generated method stub
/*for(int temp: target){
System.out.println("迭代输出目标数组元素"+temp);
}*/
System.out.println("数组元素如下:");
for(int i=0;i<target.length;i++){
System.out.println("["+i+"]:"+target[i]);
}
}
}
3.2》实现一个将数组元素相加并输出和的“处理行为”类AddCommand
package com.demo.command;
public class AddCommand implements Command {
@Override
public void process(int[] target) {
// TODO Auto-generated method stub
int result=0;
for(int temp :target){
result+=temp;
}
System.out.println("数组元素之和为:"+result);
}
}
4》测试
package com.demo.command;
public class CommandPatternTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] target={1,2,3,4,5,6};
ProcessArray pa=new ProcessArray();
//将具体的“处理行为”传入方法中,以便处理数据
//打印输出
pa.process(target, new PrintCommand());
//求和输出
pa.process(target, new AddCommand());
}
}
运行结果:
数组元素如下:
[0]:1
[1]:2
[2]:3
[3]:4
[4]:5
[5]:6
数组元素之和为:21
可以看出:可以根据具体的“处理行为”来处理数据了