命令设计模式(Command Pattern):命令模式是对命令的封装,将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。命令模式解耦了请求方和接收方,请求方只需要请求执行命令,不需要关心命令怎样被接收,怎样被操作以及是否被执行等;
在软件系统中,请求者与执行者通常是一种紧耦合关系,因为这些实现起来简单明了,但紧耦合的关系伴随着缺乏扩展性。在某些场合中,当对行为进行修改时必定要修改源代码。
而命令模式通过请求域实现间引入一个抽象命令接口,解耦和请求与实现,并且命令接口是抽象的,他由不同的子类实现,因此具备扩展性。命令模式的本质就是解耦命令与执行者;
命令设计模式主要包含如下4个角色:
【案例】
设计一个点餐场景,客户把订单交给服务员,服务员将客户需求交给后厨,后厨接收到订单需求后开始做菜;
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro: 厨师(命令接收者)
*/
public class CookReceiver {
public void menu1(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘辣椒炒肉~");
System.out.println("--------------------");
}
public void menu2(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘粉蒸肉~");
System.out.println("--------------------");
}
public void menu3(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘藜蒿腊肉~");
System.out.println("--------------------");
}
}
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro: 抽象菜单,规范客户要点的菜(命令角色,规范客户端能请求什么命令)
*/
public interface IMenuCommand {
void command();
}
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro: 具体菜单(具体命令角色)
*/
public class Menu1Command implements IMenuCommand{
// 包含命令执行接收者(用于执行具体的命令)
private CookReceiver cookReceiver;
public Menu1Command(CookReceiver cookReceiver) {
this.cookReceiver = cookReceiver;
}
@Override
public void command() {
// 最终还是接收者来执行具体的命令(最终还是厨师来炒菜)
cookReceiver.menu1();
}
}
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Menu2Command implements IMenuCommand {
// 包含命令执行接收者(用于执行具体的命令)
private CookReceiver cookReceiver;
public Menu2Command(CookReceiver cookReceiver) {
this.cookReceiver = cookReceiver;
}
@Override
public void command() {
cookReceiver.menu2();
}
}
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro: 服务员,接收客人的请求(命令请求者,接收客户端的指令)
*/
public class WaiterInvoker {
// 服务员具具备发送请求功能,发送请求给厨师进行炒菜
private IMenuCommand menuCommand;
public WaiterInvoker(IMenuCommand menuCommand) {
this.menuCommand = menuCommand;
}
public void execute(){
// 最终把命令发送给厨师
menuCommand.command();
}
}
package com.pattern.demo01_手动实现观察者设计模式;
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
// 创建一个厨师(命令接收者,最终由厨师来执行命令)
CookReceiver cookReceiver=new CookReceiver();
// 创建一个服务员(命令请求者,由服务员来发送命令)
WaiterInvoker waiterInvoker=new WaiterInvoker(new Menu1Command(cookReceiver));
waiterInvoker.execute();
waiterInvoker=new WaiterInvoker(new Menu2Command(cookReceiver));
waiterInvoker.execute();
}
}