设计模式

命令模式

一、需求

考虑这样一种需求:某个方法需要完成一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量的具体步骤无法确定,必须等执行方法时才能确
定。具体一点:假设某个方法需要遍历某个数组的数组元素,但是无法确定在遍历数组时如何处理这些元素,需要在调用时指定具体的处理行为。
对于这样的一种需求,要求把”处理行为“作为参数传入该方法,而”处理行为“用编程来实现就是一段代码。那如何将这段代码传入方法呢?在java中,类
才是一等公民,方法不能独立存在,所有传入该方法的实际是一个对象,该对象通常是某个接口的匿名实现类的实例,该接口通常被称为命令接口,这种
设计模式也被称为命令模式:

二、代码实现

1、定义一个接口,接口种定义了一个process()方法,该方法用于封装对数组的处理行为:  
1
2
3
public interface Command {
void process(int[] target);
}
2、定义了一个ProcessArrayl类,该类中包含了一个each()方法用于处理数组,但是具体如何处理暂不确定。
1
2
3
4
5
6
public class ProcessArray {
//定义一个each()方法,用于处理数组
public void each(int[] target,Command command){
command.process(target);
}
}
3、主程序调用ProcessArray对象的peocess()方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class CommandTest {
public static void main(String[] args) {
ProcessArray processArray = new ProcessArray();
int[] array = new int[]{1,2,3,4,5};

//第一种处理数组的方法
processArray.each(array, new Command() {
@Override
public void process(int[] target) {
for (int cmp:target
) {
System.out.println("迭代输出数组元素:"+cmp);
}
}
});
System.out.println("-------------------------------");
//第二种处理数组的方法
processArray.each(array, new Command() {
@Override
public void process(int[] target) {
int sum = 0;
for (int tmp:target
) {
sum+=tmp;
}
System.out.println("数组元素的和为:"+sum);
}
});
}
}
文章目录
  1. 1. 一、需求
  2. 2. 二、代码实现