世外云

js撤销功能

命令模式是一种行为设计模式,它通过将操作封装成对象来管理操作的执行和撤销,在JavaScript中,我们可以使用命令模式来实现可撤销操作。

js撤销功能-图1

我们需要定义一个命令接口,该接口包含两个方法:执行和撤销,我们可以创建具体的命令类,这些类实现了命令接口,并提供了执行和撤销的具体实现,我们创建一个调用者类,该类负责存储命令对象,并提供执行和撤销操作的方法。

下面是一个简单的示例,演示了如何使用命令模式实现可撤销操作:

// 定义命令接口
class Command {
  execute() {
    throw new Error('execute method must be implemented');
  }

  undo() {
    throw new Error('undo method must be implemented');
  }
}

// 创建具体的命令类
class AddCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.add(this.value);
  }

  undo() {
    this.receiver.subtract(this.value);
  }
}

class SubtractCommand extends Command {
  constructor(receiver, value) {
    super();
    this.receiver = receiver;
    this.value = value;
  }

  execute() {
    this.receiver.subtract(this.value);
  }

  undo() {
    this.receiver.add(this.value);
  }
}

// 创建调用者类
class Calculator {
  constructor() {
    this.value = 0;
    this.history = [];
  }

  add(value) {
    this.value += value;
    return this;
  }

  subtract(value) {
    this.value -= value;
    return this;
  }
}

在上面的示例中,我们定义了一个命令接口`Command`,它包含了`execute`和`undo`两个方法,我们创建了两个具体的命令类`AddCommand`和`SubtractCommand`,它们分别实现了添加和减去操作,这两个命令类都继承了`Command`接口,并提供了具体的执行和撤销实现,我们创建了一个`Calculator`类作为调用者,它负责存储当前值和一个历史记录数组,当执行命令时,我们将命令对象添加到历史记录数组中,当撤销命令时,我们从历史记录数组中获取上一个命令对象,并调用其`undo`方法来撤销操作。

我们可以使用这个简单的计算器来演示可撤销操作的效果:

const calculator = new Calculator();
const history = []; // 用于保存命令对象的数组
calculator.add(5).add(10).add(20); // 执行添加操作,结果为35
console.log(calculator.value); // 输出35
history.push(new AddCommand(calculator, 5)); // 将添加操作的命令对象添加到历史记录数组中
history.push(new AddCommand(calculator, 10)); // 将添加操作的命令对象添加到历史记录数组中
history.push(new AddCommand(calculator, 20)); // 将添加操作的命令对象添加到历史记录数组中
calculator.subtract(15).subtract(10); // 执行减去操作,结果为10
console.log(calculator.value); // 输出10
history.push(new SubtractCommand(calculator, 15)); // 将减去操作的命令对象添加到历史记录数组中
history.push(new SubtractCommand(calculator, 10)); // 将减去操作的命令对象添加到历史记录数组中
calculator.undo(); // 撤销上一个操作,结果为20(因为之前是减去操作)
console.log(calculator.value); // 输出20
calculator.undo(); // 撤销上一个操作,结果为35(因为之前是添加操作)
console.log(calculator.value); // 输出35
分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~