命令模式

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15

命令模式(Command):将请求与实现解耦并封装成独立对象,从而使不同的请求对客户端的实现参数化。

命令模式将业务功能的逻辑封装在一个对象里,这个对象提供了一个参数化的请求接口,通过调用这个接口并传递一些参数实现调用命令对象内部的一些方法,请求的部分很简单,只需要按照给定格式调用即可,所以实现部分的封装才是重点,因为它要为请求提供所需的方法。

把那些动态的需求命令化

// 将canvas上下文引用对象安全地封装在一个命令对象的内部,如果他人想调用可以直接通过命令对象调用一条命令,而不需要直接引用canvas上下文对象
var CanvasCommand = (function(){
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  var Action = {
    fillStyle: function(c) { // 填充色彩
      ctx.fillStyle = c;
    },
    fillRect: function(x, y, w, h) { // 填充矩形
      ctx.fillRect(x, y, w, h);
    },
    strokeRect: function(x, y, w, h) { // 描边矩形
      ctx.strokeRect(x, y, w, h);
    },
    // 每个方法里面可以做一些兼容性的处理。
    // 也可以根据业务需求,实现canvas 原API没有的的方法
    // ...
  }

  return {
    execute: function exec(msg) {
      if (!msg) {
        return;
      }
      
      if (msg.length) {
        for (var i = 0, len = msg.length; i < len; i++) {
          exec(msg[i])
        }
      } else {
        msg.param = Object.prototype.toString.call(msg.param) === "[object Array]" ? msg.param : [msg.param];
        Action[msg.command].apply(Action, msg.param)
      }
    }
  }
})();

CanvasCommand.execute([
  { command: 'fillStyle', param: 'red'},
  { command: 'fillRect', param: [20, 20, 100, 101]},
  { command: 'strokeRect', param: [120, 20, 100, 101]},
])