[命令设计模式详解]C/Java/JS/Go/Python/TS不同语言实现

科技资讯 投稿 6200 0 评论

[命令设计模式详解]C/Java/JS/Go/Python/TS不同语言实现

简介

如果你需要通过操作来参数化对象,可使用命令模式。如果你想要将操作放入队列中、操作的执行或者远程执行操作,可使用命令模式。如果你想要实现操作回滚功能,可使用命令模式。

作用

    将不同命令按照抽象命令封装成不同的对象,将这些命令放到调用者里。
  1. 客户通过调用者执行命令再去调用接受者的动作,顺序为:客户调用方->调用者->命令对象->接受者。
  2. 同其他对象一样,命令也可以实现序列化,从而方便地写入文件或数据库中,实现延迟执行。

实现步骤

    创建一个抽象命令接口,实现基本的命令方法。
  1. 创建多个具体命令类,实现抽象命令接口,以来命令接收者。
  2. 创建命令接收者,也就是具体业务类,接受命令并执行动作。
  3. 创建命令调用者,这是一个聚合命令的类,添加命令和执行命令。

UML

Java代码

基础命令接口

// Command.java 命令抽象接口
public interface Command {
   void execute(;
}

 

具体命令类,可以多个命令

// BuyCommand.java 购买命令,操作receiver,实现了抽象命令类 public class BuyCommand implements Command { private StockReceiver stockReceiver; public BuyCommand(StockReceiver stockReceiver { this.stockReceiver = stockReceiver; } // 命令类调用执行者的实际动作 public void execute( { System.out.println(this.getClass(.getName( + "::execute( "; this.stockReceiver.buy(; } } // SellCommand.java 出售命令,操作receiver,实现了抽象命令类 public class SellCommand implements Command { private StockReceiver stockReceiver; public SellCommand(StockReceiver stockReceiver { this.stockReceiver = stockReceiver; } // 命令类调用执行者的实际动作 public void execute( { System.out.println(this.getClass(.getName( + "::execute( "; stockReceiver.sell(; } }

 

命令调用类

// CommandInvoker.java 命令调用类,通过关联命令来执行命令的调用 public class CommandInvoker { private List<Command> commandList = new ArrayList<Command>(; // 储存命令 public void takeOrder(Command command { System.out.println(this.getClass(.getName( + "::takeOrder( " + command.getClass(.getName(; commandList.add(command; } // 统一执行 public void executeOrders( { System.out.println(this.getClass(.getName( + "::executeOrders( "; for (Command command : commandList { command.execute(; } commandList.clear(; } }

 

命令接收执行类

// StockReceiver.java 命令模式真正的执行类,不直接对外,通过command来调用
public class StockReceiver {

   private String name;
   private int num;

   public StockReceiver(String name, int num {
      this.name = name;
      this.num = num;
   }

   public void buy( {
      System.out.println(this.getClass(.getName( + "::buy( [name=" + this.name + " num=" + this.num + "]";
   }

   public void sell( {
      System.out.println(this.getClass(.getName( + "::sell( [name=" + this.name + " num=" + this.num + "]";
   }

   public 

编程笔记 » [命令设计模式详解]C/Java/JS/Go/Python/TS不同语言实现

赞同 (37) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽