行业知识
设计模式—命令模式:探索【命令模式】的奥秘与应用实践!
2026-11-11 08:47:26
来源:互联网转载
命令模式
命令���式是一种行为设计模式,它的主要目的是将请求封装成一个对象,从而使得请求的发送者和接收者之间进行解耦。
在命令模式中,命令被封装为一个对象,包含了需要执行的操作以及执行这些操作所需的所有参数。
命令的发送者不需要知道接收者的具体情况,也不需要知道命令如何被执行,只需要将命令对象发送给接收者,由接收者来解析并执行命令。
应用场景
- 请求者创建命令,消费者根据命令动态做出响应的场景
- 撤销和恢复操作:例如文本编辑器中的撤销和恢复功能。
- 请求日志记录:可以记录用户操作的日志,以便后期查看。
- 任务队列:例如线程池中的任务队列,可以将命令放入队列中异步执行。
- 菜单项操作:例如图形界面中的菜单项单击、快捷键操作等。
命令模式中的角色
- 命令(Command): 命令是一个抽象的对象,封装了执行特定操作的方法。它通常包含一个执行操作的接口,可能还包含撤销操作的接口。
- 具体命令(Concrete Command): 具体命令是命令的具体实现,它实现了命令接口中定义的方法。 每一个具体命令都与一个特定的接收者相关联,负责调用接收者执行请求的操作。
- 接收者(Receiver): 接收者是实际执行命令操作的对象。它包含了命令执行时所需的具体逻辑。
- 调用者/发送者(Invoker/Sender): 调用者是命令的发送者,它负责创建命令对象并将其发送给接收者。
- 客户端(Client): 客户端创建具体命令对象,并将其与相应的接收者关联起来,然后将命令对象传递给调用者。
优点
- **解耦:**发送者和接收者之间的解耦,发送者不需要知道接收者的具体实现,只需要知道如何发送命令。
- **扩展性:**易于添加新的命令和接收者,不会影响到已有的代码。
- **支持撤销和重做操作:**可以通过保存命令历史来支持撤销和重做操作。
缺点
- 可能导致类爆炸:为每个操作创建一个具体的命令类可能会导致类爆炸,尤其是在具有大量命令的系统中。
- 命令的逻辑混乱:如果命令的逻辑比较复杂,命令模式可能会导致命令的逻辑混乱。
Java中的注意事项
- 合理的接口设计:命令接口应该设计得简洁清晰,易于使用。
- 抽象类的使用:可以使用抽象类来实现部分命令共同的行为,以避免重复代码。
- 命令的实现方式:根据业务需求选择合适的命令实现方式,如简单命令、宏命令等。
- 线程安全性:在多线程环境下使用命令模式时,需要考虑命令对象的线程安全性。
1.案例1-小厨房(JavaSE版本)
# 餐厅,服务员先根据客户创建订单,并将订单发送给厨师,厨师根据具体的订单生产
1.1.创建命令接口
/** * 抽象命令接口 */public interface CookCommand {/** * 执行命令 */void execute();}1.2.创建传输的参数
import lombok.Getter;import lombok.Setter;import java.util.ArrayList;import java.util.List;@Getter @Setterpublic class Order {// 订单数量private final List orderList;public Order() {this.orderList = new ArrayList();}// 创建订单public void createOrder(Menu menu){orderList.add(menu);}// 获取订单public List getOrderList(){return orderList;}@Getter @Setterstatic class Menu{private String menuName; // 菜品名称private Integer num; // 菜品数量}}1.3.创建接收者
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;import java.util.List;/** * 命令接收人 * @author 13723 * @version 1.0 * 2024/2/4 11:08 */public class Cook {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public void makeMenu(List menuList){logger.info("-------------------------> 厨师准备开始做菜
上一篇:电脑服务器异常怎么解决?
下一篇:怎么进公司服务器看东西?