js撤销功能
命令模式是一种行为设计模式,它通过将操作封装成对象来管理操作的执行和撤销,在JavaScript中,我们可以使用命令模式来实现可撤销操作。
我们需要定义一个命令接口,该接口包含两个方法:执行和撤销,我们可以创建具体的命令类,这些类实现了命令接口,并提供了执行和撤销的具体实现,我们创建一个调用者类,该类负责存储命令对象,并提供执行和撤销操作的方法。
下面是一个简单的示例,演示了如何使用命令模式实现可撤销操作:
// 定义命令接口 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免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。