UML类图
应用场景
一个系统中需要经常撤销和恢复某个命令的时候,则可使用命令模式;另外,命令模式可以使得调用者和实现者解耦。如在GUI设计中,每个按钮的一个消息是一条Command。
代码实现
Command类,用来传递调用消息
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void excute();
}
具体命令类实现
public class ConcreteCommand1 extends Command {
public ConcreteCommand1(Receiver receiver) {
super(receiver);
}
@Override
public void excute() {
receiver.action1();
}
}
public class ConcreteCommand2 extends Command{
public ConcreteCommand2(Receiver receiver) {
super(receiver);
}
@Override
public void excute() {
receiver.action2();
}
}
命令通知者
import java.util.ArrayList;
import java.util.List;
public class Invoker {
private List<Command> list = new ArrayList<Command>();
public void addCommand(Command command){
this.list.add(command);
}
public void notifyAllCommands(){
for (Command command : list) {
command.excute();
}
}
}
行动的执行者
public class Receiver {
public void action1(){
System.out.println("执行请求1");
}
public void action2(){
System.out.println("执行请求2");
}
}
客户端实现
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
Receiver receiver = new Receiver();
Command command1 = new ConcreteCommand1(receiver);
Command command2 = new ConcreteCommand2(receiver);
invoker.addCommand(command1);
invoker.addCommand(command2);
invoker.notifyAllCommands();
}
}
优点
1、它能比较容易的设计一个命令队列
2、在需要记录命令日志的时候比较容易实现
3、允许接收请求的一方是否要否决请求
4、可以容易的实现对请求的撤销和重做
5、Client与Action解耦,即行为请求者与行为实现者解耦