命令模式详解(定义作用及应用实例)

命令模式详解(定义作用及应用实例)-mikechen

命令模式定义

命令模式,英文名Command Pattern,是一种行为型模式,是指将“行为请求者”和”行为实现者”解耦开来。

我们日常的开发就很好地体现出了命令模式,比如:领导将开发任务指派给程序员去完成,其中领导就是“命令的发布者”,程序员就是“命令的具体执行者”,这个指派的动作就是“具体的命令”。

 

命令模式作用

消除了 请求发送者 与 请求接收者 之间的耦合,对象之间的调用关系更加灵活,实现解耦。

 

命令模式角色

命令模式主要分为5大角色,如下图所示:

命令模式详解(定义作用及应用实例)-mikechen

1.命令角色(Command)

定义命令的接口,声明执行的方法;

2.具体命令角色(Concrete Command)

实现命令接口,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

3.接收者角色(Receiver)

负责具体实施和执行一个请求。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

4.请求者(调用者)角色(Invoker)

负责调用命令对象执行请求。

5.客户角色(Client)

创建一个具体命令对象并设定该命令对象的接收者。

 

命令模式案例

下面通过一个案例来加深对该模式的理解:实现通过遥控器开关电视以及撤销上一次操作的功能。

1.命令接口 :对应抽象命令角色

命令模式详解(定义作用及应用实例)-mikechen

2.电视:对应接收者角色

命令模式详解(定义作用及应用实例)-mikechen

3.具体命令实现类

public class RemoteController {
  // 开按钮的命令
  private Command onCommand = new NoCommand();
  // 关按钮的命令
  private Command offCommand = new NoCommand();
  // 执行撤销的命令
  private Command undoCommand = new NoCommand();

  // 给按钮设置相关命令
  public void setCommand(Command onCommand, Command offCommand) {
    this.onCommand = onCommand;
    this.offCommand = offCommand;
  }

  // 按下打开按钮
  public void onButtonWasPushed() {
    this.onCommand.execute();
    // 记录本次操作
    this.undoCommand = this.onCommand;
  }

  // 按下关闭按钮
  public void offButtonWasPushed() {
    this.offCommand.execute();
    // 记录本次操作
    this.undoCommand = this.offCommand;
  }

  // 按下撤销按钮
  public void undoButtonWasPushed() {
    this.undoCommand.undo();
  }
}

4.遥控器 :对应调用者角色

命令模式详解(定义作用及应用实例)-mikechen

5.客户端测试类

命令模式详解(定义作用及应用实例)-mikechen

执行结果如下所示:

======按下打开按钮======
电视机打开了。
======按下关闭按钮======
电视机关闭了。
======撤销上次操作======
电视机打开了。

 

命令模式应用

  • 当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
  • 例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
  • 有时候调用者调用目标对象后,需要回调一些方法。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法