一.命令模式的定义
将一个请求封装成对象,从而使不同的请求参数化,对请求排队、记录以及撤销,是一种行为性模式
二.命令模式的写法
命令模式有四个角色,一个Invoke(负责接收处理指令)抽象的指令Command 具体的指令ConcreteCommand以及命令的执行者Receiver。 这里拿我们到饭店吃饭时点餐的例子,来看看下面的UML类图
我们来看看代码这么写的,首先看服务员代码,通过UMLl类图知道,服务员只需要知道命令,并可以取消,执行,添加命令即可:
/**
* 理解成服务员
* @author Seven
*
*/
public class Invoker {
List<Command> commands=new ArrayList<>();
public void addCommand(Command command) {
System.out.println("服务员将客人命令追加到队列中");
commands.add(command);
}
public void execute() {
System.out.println("服务员执行客人的命令对列");
for (Command command : commands) {
command.executeCommand();
}
}
public void removeCommand(Command command) {
System.out.println("服务员将客人命令取消");
commands.remove(command);
}
}
那抽象命令应该怎么写呢,首先是有个具体执行者的引用,也就是厨师,然后将执行方法抽象出来,对应的命令有对应的实现,下面请看代码:
/**
* 理解成抽象的行为 比如烤鸡 烤羊肉串
*
* @author Seven
*
*/
public abstract class Command {
protected Receiver receiver;
public void setCommand(Receiver receiver) {
this.receiver = receiver;
}
public abstract void executeCommand();
}
/** 具体的命令比如烤鸡
* @author Seven
*
*/
public class ConcreteCommand extends Command{
@Override
public void executeCommand() {
if(receiver!=null) {
receiver.execute();
}else {
System.out.println("no executor");
}
}
}
下面就是大厨也就是接受命令、执行干活的人了
/**
* 真正的执行者 比如大厨
* @author Seven
*
*/
public class Receiver {
public void execute() {
System.out.println("干活");
}
}
好了,这个就是命令模式,他这个有点像生产消费者模型,服务员生产需求,大厨赋值执行需求,