【设计模式】命令模式
命令模式,主要用来封装调用。让命令的发起者(client) 和命令的接收者(receiver)解耦。发起者只需要发起一个命令,并不需要去具体关心命令如何去执行,等等具体的细节。而命令接收者,只需要收到命令,然后去完成命令。
模拟一个客户去餐馆点一碗炸酱面的场景,
//抽象命令接口
interface Command {
void execute();
}
// 命令接收者厨师(做一碗炸酱面)
class Receiver {
void Action() {
System.out.println("炸酱面");
}
}
// 具体的命令类,实现命令接口 ,操作命令接收者(做炸酱面的命令)
class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.Action();
}
}
// 到这里已经有了一个客户, 和一个具体的命令。
// 这里很明显这个客户需要一个服务员来帮他点菜
// 因此我们还需要一个调度类(服务员)
class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void invoke(){
command.execute();
}
}
//现在什么都有了,我们模拟一个客户点菜的场景
public class TestCommand {
public static void main(String[] args) {
//首先需要一个会做炸酱面的厨师
Receiver receiver = new Receiver();
//然后需要一个命令,命令厨师给他做炸酱面
Command command = new ConcreteCommand(receiver);
//命令有了之后需要一个服务员帮他传递这个命令,总不能让顾客自己到后厨 ,和厨师说要炸酱面(不规范的餐馆倒是可以)
Invoker invoker = new Invoker();
//服务员拿到客户的命令
invoker.setCommand(command);
//服务员执行客户的命令
invoker.invoke();
}
}
命令模式扩展性很强,服务员可以接收所有的点菜命令,但是这个模式也有一个缺点,类太多了,一个炸酱面命令就是一个类,一个拌面也是一个类。

浙公网安备 33010602011771号