命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。 请求以命令的形式包裹在对象中,并传给调用对象。 调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
我们来模拟一下辣条厂中,小组长命令员工去工作的场景。
- 创建一个命令处理接口
public interface Receiver {
void action(String desc);
}
- 员工实现接口处理命令
public class Employee implements Receiver {
@Override
public void action(String desc) {
System.out.println("Employee 执行命令:" + desc);
}
}
- 创建命令接口
public interface Command {
void execute(String desc);
}
public class WorkCommand implements Command {
private Receiver receiver;
public WorkCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute(String desc) {
receiver.action(desc);
}
}
- 创建发送命令的小组长
public class Leader implements Receiver {
private Command command;
public Leader(Command command) {
this.command = command;
}
@Override
public void action(String desc) {
command.execute(desc);
}
}
- 测试
public class CommandTest {
@Test
public void testCommand() {
Receiver receiver = new Employee();//创建命令接受者
Command command = new WorkCommand(receiver);//创建命令
Leader leader = new Leader(command);//创建命令发送者
leader.action("去工作");//发送命令
}
}
- 输出
03-23 11:53:42.221 31493-31521/? I/System.out: Employee 执行命令:去工作
从输出信息可以看出,最后员工执行了命令去工作了。
认为是命令的地方都可以使用命令模式,比如: 1. GUI 中每一个按钮都是一条命令。 2. 模拟 CMD。
在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
一次设定,统一执行(与责任链相反)。
- 降低了系统耦合度。
- 新的命令可以很容易添加到系统中去。
使用命令模式可能会导致某些系统有过多的具体命令类。
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。