九折技术 九折技术
首页
  • Go
  • MIT-6824
  • 算法与数据结构
  • 面向对象
  • 代码整洁
  • 重构
  • 设计模式
  • 学习
  • 技术
  • 人文
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

HoldDie

长期有耐心,一切才刚刚开始!
首页
  • Go
  • MIT-6824
  • 算法与数据结构
  • 面向对象
  • 代码整洁
  • 重构
  • 设计模式
  • 学习
  • 技术
  • 人文
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 代码整洁

  • 重构

  • 设计模式

    • 创建型-单例模式
    • 创建型-工厂模式
    • 创建型-建造者模式
    • 创建型-原型模式
    • 结构型-代理模式
    • 结构型-桥接模式
    • 结构型-装饰器模式
    • 结构型-适配器模式
    • 结构型-门面模式
    • 结构型-组合模式
    • 结构型-享元模式
    • 行为型-观察者模式
    • 行为型-模板模式
    • 行为型-策略模式
    • 行为型-责任链模式
    • 行为型-状态模式
    • 行为型-迭代器模式
    • 行为型-访问者模式
    • 行为型-备忘录模式
    • 行为型-命令模式
      • 行为型-解释器模式
      • 行为型-中介模式
    • 架构
    • 设计模式
    holddie
    2020-11-24

    行为型-命令模式

    # 命令模式

    • Command Design Pattern
    • 命令模式将请求(命令)封装为一个对象,这个可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支撑请求(命令) 的排队执行、记录日志、撤销等(附加控制)功能。
    • 命令模式用的最核心的实现手段就是将函数封装成对象。当我们把函数封装成对象之后,对象就可以存储下来,方便控制执行。
    • 命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令,给命令记录日志等等。

    # 命令模式和策略模式的区别

    • 在策略模式中,不同策略具有相同的目的、不同的实现、相互之间可以替换。
    • 在命令模式中,不同的命令具有不同的目的,对应不同的处理逻辑,并且相互之间不可替换。
    
    public interface Command {
      void execute();
    }
    
    public class GotDiamondCommand implements Command {
      // 省略成员变量
    
      public GotDiamondCommand(/*数据*/) {
        //...
      }
    
      @Override
      public void execute() {
        // 执行相应的逻辑
      }
    }
    //GotStartCommand/HitObstacleCommand/ArchiveCommand类省略
    
    public class GameApplication {
      private static final int MAX_HANDLED_REQ_COUNT_PER_LOOP = 100;
      private Queue<Command> queue = new LinkedList<>();
    
      public void mainloop() {
        while (true) {
          List<Request> requests = new ArrayList<>();
    
          //省略从epoll或者select中获取数据,并封装成Request的逻辑,
          //注意设置超时时间,如果很长时间没有接收到请求,就继续下面的逻辑处理。
    
          for (Request request : requests) {
            Event event = request.getEvent();
            Command command = null;
            if (event.equals(Event.GOT_DIAMOND)) {
              command = new GotDiamondCommand(/*数据*/);
            } else if (event.equals(Event.GOT_STAR)) {
              command = new GotStartCommand(/*数据*/);
            } else if (event.equals(Event.HIT_OBSTACLE)) {
              command = new HitObstacleCommand(/*数据*/);
            } else if (event.equals(Event.ARCHIVE)) {
              command = new ArchiveCommand(/*数据*/);
            } // ...一堆else if...
    
            queue.add(command);
          }
    
          int handledCount = 0;
          while (handledCount < MAX_HANDLED_REQ_COUNT_PER_LOOP) {
            if (queue.isEmpty()) {
              break;
            }
            Command command = queue.poll();
            command.execute();
          }
        }
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    编辑
    #命令模式
    上次更新: 2020/11/29, 15:11:00
    行为型-备忘录模式
    行为型-解释器模式

    ← 行为型-备忘录模式 行为型-解释器模式→

    最近更新
    01
    行为型-访问者模式
    11-24
    02
    行为型-备忘录模式
    11-24
    03
    行为型-解释器模式
    11-24
    更多文章>
    Theme by Vdoing | Copyright © 2019-2020 HoldDie | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式