从JDK中学习设计模式——命令模式

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

概述

命令模式(Command Pattern)是将一个请求封装为一个对象,从而根据不同的请求对客户参数化。命令模式是一种对象行为型模式,命令模式可对请求排队、记录请求日志和支持撤销,因此又称为动作(Action)模式事务(Transaction)模式

结构

命令模式UML.png

  • Command(抽象命令类):一般是抽象类或接口,声明了一组执行请求的方法,这些方法可以调用接收者。
  • ConcreteCommand(具体命令类):抽象命令类的子类,实现了在抽象命令类中声明的方法。它持有接收者的引用,针对不同的命令调用接收者中的具体操作方法。
  • Invoker(调用者):即请求发送者,持有抽象命令类的引用,。调用者不必在设计时就确定其接收者,它只与抽象命令类之间存在关联关系。可以在程序运行时将具体的命令对象注入其中,再通过具体命令对象的执行请求方法来间接调用请求接收者的相关操作。
  • Receiver(接收者):它可以是接口或具体实现类,真正实现请求的处理

优点

  1. 调用者与接收者之间没有任何依赖关系,降低了系统的耦合度
  2. 增加新的具体命令类很容易,无须修改原系统代码,符合开闭原则
  3. 可以比较容易地设计一个组合命令。
  4. 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。

缺点

  1. 如果命令过多会造成系统庞大,类膨胀。
  2. 调用者通过抽象命令类来编程,真正的执行操作是具体命令类调用接受者来实现的,增加了系统的复杂度,理解难度增加

应用场景

  1. 需要向某些对象发送请求,但是并不知道请求的接收者,可在程序运行时指定一个具体的接收者。
  2. 需要支持命令的撤销和恢复
  3. 系统需要将一组操作组合在一起形成宏命令

JDK 中的应用

在 JDK 中 java.lang.Runnable 使用了命令模式。

Guess you like

Origin juejin.im/post/7032681217963065381