位置:首页 > web前端 > javascript

javascript 命令模式 的案例介绍与使用

dearweb 发布:2023-03-09 07:59:58阅读:

JavaScript命令模式是一种行为型设计模式,它通过将请求封装成一个对象,从而允许我们将不同的请求排队、记录请求日志、支持撤销操作等。以下是一个JavaScript命令模式的案例:


假设我们有一个灯对象,该对象有两个方法:turnOn()和turnOff(),用于打开和关闭灯。我们希望创建一个遥控器对象,该对象可以记录执行过的命令,并支持撤销操作。我们可以使用命令模式来实现这个功能。代码如下:


```javascript

// 定义灯对象

var Light = {

  turnOn: function() {

    console.log("Light is on.");

  },

  

  turnOff: function() {

    console.log("Light is off.");

  }

}


// 定义命令对象

var Command = {

  execute: function() {},

  undo: function() {}

}


// 定义打开灯命令对象

var TurnOnCommand = Object.create(Command);

TurnOnCommand.execute = function() {

  Light.turnOn();

}

TurnOnCommand.undo = function() {

  Light.turnOff();

}


// 定义关闭灯命令对象

var TurnOffCommand = Object.create(Command);

TurnOffCommand.execute = function() {

  Light.turnOff();

}

TurnOffCommand.undo = function() {

  Light.turnOn();

}


// 定义遥控器对象

var RemoteControl = {

  commands: [],

  current: -1,

  

  execute: function(command) {

    command.execute();

    this.commands.push(command);

    this.current++;

  },

  

  undo: function() {

    if (this.current >= 0) {

      this.commands[this.current].undo();

      this.current--;

    }

  },

  

  redo: function() {

    if (this.current < this.commands.length - 1) {

      this.current++;

      this.commands[this.current].execute();

    }

  }

}


// 测试遥控器对象

RemoteControl.execute(TurnOnCommand); // 输出:Light is on.

RemoteControl.execute(TurnOffCommand); // 输出:Light is off.

RemoteControl.undo(); // 输出:Light is on.

RemoteControl.redo(); // 输出:Light is off.

```


在上述代码中,我们定义了一个名为Light的对象,该对象包含了打开和关闭灯的方法。然后,我们定义了一个名为Command的对象,它包含execute和undo方法,用于执行和撤销命令。接下来,我们定义了TurnOnCommand和TurnOffCommand对象,它们分别表示打开和关闭灯的命令。这些命令对象都继承了Command对象,并实现了自己的execute和undo方法。


然后,我们定义了一个名为RemoteControl的对象,它包含了commands、current、execute、undo和redo方法。这个遥控器对象可以执行、撤销和重做命令,并记录命令执行的顺序。我们使用execute方法执行TurnOnCommand和TurnOffCommand命令,并使用undo和redo方法撤销和重做命令。


24人点赞 返回栏目 提问 分享一波

小礼物走一波,支持作者

还没有人赞赏,支持一波吧

留言(问题紧急可添加微信 xxl18963067593) 评论仅代表网友个人 留言列表

暂无留言,快来抢沙发吧!

本刊热文
网友在读
手机扫码查看 手机扫码查看