【设计模式】命令行模式_封装

命令模式

“请求”封装成对象(命令对象),以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。


使用场景

  1. 系统需要将请求调用者请求接收者解耦,使得调用者和接收者不直接交互。
  2. 系统需要在不同的时间指定请求、将请求排队和执行请求。
  3. 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
  4. 系统需要将一组操作组合在一起,即支持宏命令

基本类图

【设计模式】命令行模式_命令模式_02



示例:具体需求

现在有如下请求:希望能通过遥控器实现:开灯、关灯、开门、关门等;

开灯、关灯的具体执行是在Light类中,开门、关门的具体执行是在Door类中;

现在希望把开关灯、开关门的请求封装到Command对象中。


类图及目录结构

【设计模式】命令行模式_命令行模式_03


【设计模式】命令行模式_设计模式_04


Command接口

【设计模式】命令行模式_设计模式_05


Receiver

【设计模式】命令行模式_命令行模式_06



【设计模式】命令行模式_封装_07


ConcreteCommand:封装具体的请求

共有4个Command:

  1. 开灯请求;
  2. 开门请求;
  3. 无任何操作的请求;
  4. 宏请求:可以包含多个Commands

【设计模式】命令行模式_设计模式_08



【设计模式】命令行模式_封装_09



【设计模式】命令行模式_命令模式_10



【设计模式】命令行模式_命令行模式_11


Invoke 调用者

个人理解:

之所以需要通过调用者来执行Command,而不是直接command.execute(),主要有如下好处:

  1. 通过client调用时,比较统一;
  2. 可以在Invoke中封装undo以及redo命令;

【设计模式】命令行模式_封装_12


client 程序测试

【设计模式】命令行模式_命令行模式_13


【设计模式】命令行模式_命令行模式_14


高级用法

【设计模式】命令行模式_命令行模式_15