command模式

作者: oneWeekOneTopic | 来源:发表于2018-06-08 10:36 被阅读3次

解决问题

使发令者与执行者之间相分离。

应用场景

比如后台开发过程中的请求数据库、RPC接口等。通常情况下,我们会将请求逻辑(参数封装、结果解析、异常控制等)交给请求方控制,这样会导致代码逻辑十分混乱,业务逻辑与接口请求逻辑混杂在一起。

原理图

image
  • Client:调用方

  • Receiver:这个可有可无,主要做回调。获取concreteCommand的执行结果,返回给客户端

  • ConcreteCommand:具体命令执行者

  • Command:抽象类或者接口(一般情况是抽象类,用于封装通用逻辑)

  • Caller:被调用的接口(一个或多个)

示例

这个的代码写得太多了,就不再举了,借用wikipedia的例子吧。

import java.util.List;
import java.util.ArrayList;

/** The Command interface */
public interface Command {
   void execute();
}

/** The Invoker class */
public class Switch {
   private List<Command> history = new ArrayList<Command>();

   public void storeAndExecute(final Command cmd) {
      this.history.add(cmd); // optional
      cmd.execute();
   }
}

/** The Receiver class */
public class Light {

   public void turnOn() {
      System.out.println("The light is on");
   }

   public void turnOff() {
      System.out.println("The light is off");
   }
}

/** The Command for turning on the light - ConcreteCommand #1 */
public class FlipUpCommand implements Command {
   private Light theLight;

   public FlipUpCommand(final Light light) {
      this.theLight = light;
   }

   @Override    // Command
   public void execute() {
      theLight.turnOn();
   }
}

/** The Command for turning off the light - ConcreteCommand #2 */
public class FlipDownCommand implements Command {
   private Light theLight;

   public FlipDownCommand(final Light light) {
      this.theLight = light;
   }

   @Override    // Command
   public void execute() {
      theLight.turnOff();
   }
}

/* The test class or client */
public class PressSwitch {
   public static void main(final String[] arguments){
      // Check number of arguments
      if (arguments.length != 1) {
         System.err.println("Argument \"ON\" or \"OFF\" is required.");
         System.exit(-1);
      }

      final Light lamp = new Light();
      
      final Command switchUp = new FlipUpCommand(lamp);
      final Command switchDown = new FlipDownCommand(lamp);

      final Switch mySwitch = new Switch();

      switch(arguments[0]) {
         case "ON":
            mySwitch.storeAndExecute(switchUp);
            break;
         case "OFF":
            mySwitch.storeAndExecute(switchDown);
            break;
         default:
            System.err.println("Argument \"ON\" or \"OFF\" is required.");
            System.exit(-1);
      }
   }
}

解释一下,Switch相当于是原理图Client,并没有使用Receiver

参考

https://en.wikipedia.org/wiki/Command_pattern

相关文章

  • MAC下sublime text3的列操作

    command + a 全选; command + shift + L 进入列编辑模式

  • Command模式

    命令模式(Command) 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Tran...

  • COMMAND 模式

    COMMAND 模式 一.概述 命令模式,又称动作模式,目的是将一个请求封装成一个对象,从而使你可用不同的请求对客...

  • command模式

    解决问题 使发令者与执行者之间相分离。 应用场景 比如后台开发过程中的请求数据库、RPC接口等。通常情况下,我们会...

  • command模式

    不同的命令产生不同的结果,由invoke发放命令 command.h #ifndef _COMMAND_H#def...

  • Command模式

    命令模式感觉和之前的备忘录模式有点类似,不过备忘录模式是把程序当时的状态储存起来,而命令模式则是把程序每一步的命令...

  • vi的使用

    进入vi后处于command模式,按下i键进入插入模式编辑文件,在「命令行模式(command mode)」下,按...

  • 敏捷软件开发(原则、模式与实践)第三部分 设计模式-读书笔记1

    第十三章 COMMAND模式和ACTIVE OBJECT模式 COMMAND模式: 该模式仅由一个具有唯一方法的接...

  • 8.命令模式 命令模式即Command模式,此模式通过被称为Command的类封装了对目标对象的调用行为以及调用参...

  • 图解GoF 23种设计模式

    Chain of Responsibility(职责链模式) Command(命令模式) Interpreter(...

网友评论

    本文标题:command模式

    本文链接:https://www.haomeiwen.com/subject/uavosftx.html