接口实现命令,降低耦合度
在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象之间的调用关系更加灵活,可以灵活地指定请求接收者以及被请求的操作。命令模式为此类问题提供了一个较为完美的解决方案。
命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
优点
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
适用情况
1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。
我的实现代码:
package CommandImplement;
/**
* 定义接口,接口函数是处理目标数组
*/
public interface Command {
void progress(int[] target);
}
实现接口:
//打印每个数字的实现
public class PrintCommand implements Command {
@Override
public void progress(int[] target) {
for (int tmp : target) {
System.out.println("打印命令" + tmp);
}
}
}
//对数组求和的实现
public class AddCommand implements Command {
int sum = 0;
@Override
public void progress(int[] target) {
for (int tmp : target) {
sum += tmp;
}
System.out.println("数组的总和是:" + sum);
}
}
/**
* 通过command接口,用类ProcessArray实现了具体的处理行为与上一级分离
*/
public class ProcessArray {
public void process(int[] target, Command cmd) {
cmd.progress(target);
}
}
public class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int [] target ={1,2,3,4,5,6};
//通过new出来的类来实现命令模式
pa.process(target, new PrintCommand());
System.out.println("--------------------");
pa.process(target, new AddCommand());
}
}