• 【前端设计模式】之备忘录模式


    备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。在前端开发中,备忘录模式可以用于保存和恢复用户界面的状态,以及实现撤销和重做功能。

    备忘录模式特性:

    1. 封装了对象的状态:备忘录对象可以保存原始对象的内部状态,并且只有原始对象可以访问该状态。
    2. 可以恢复对象的状态:备忘录对象可以将保存的状态重新应用到原始对象上,使其恢复到之前的状态。
    3. 不破坏封装性:备忘录模式通过将状态保存在备忘录对象中,避免了直接暴露原始对象的内部状态。

    应用示例

    1. 保存表单数据:

     
    
    1. // 备忘录
    2. class FormMemento {
    3. constructor(state) {
    4. this.state = state;
    5. }
    6. }
    7. // 原始对象
    8. class Form {
    9. constructor() {
    10. this.state = {};
    11. }
    12. save() {
    13. return new FormMemento(this.state);
    14. }
    15. restore(memento) {
    16. this.state = memento.state;
    17. }
    18. }
    19. // 使用示例
    20. const form = new Form();
    21. form.state = { name: 'John', age: 25 };
    22. const memento = form.save();
    23. form.state = { name: 'Alice', age: 30 };
    24. form.restore(memento);
    25. console.log(form.state); // { name: 'John', age: 25 }

    上述代码中,Form类表示一个表单对象,FormMemento类表示表单的备忘录对象。通过调用save方法可以保存表单的状态,调用restore方法可以恢复表单到之前的状态。

    1. FormMemento类:这是一个简单的类,它只有一个属性,即state。这个类的作用是保存表单(Form)对象的状态。

    2. Form类:这个类具有一个state属性,它是一个对象,用于存储表单的状态。这个类有两个方法:

      • save()方法:此方法创建并返回一个FormMemento对象,该对象包含当前Form对象的状态。
      • restore(memento)方法:此方法接受一个FormMemento对象,并将其状态复制到当前Form对象中。
    3. 使用示例:首先,创建一个新的Form对象。然后,设置其状态,调用save()方法保存当前状态,更改状态,最后使用restore()方法恢复到之前保存的状态。

    2. 撤销和重做功能

     
    
    1. // 备忘录
    2. class EditorMemento {
    3. constructor(content) {
    4. this.content = content;
    5. }
    6. }
    7. // 原始对象
    8. class Editor {
    9. constructor() {
    10. this.content = '';
    11. this.history = [];
    12. this.currentIndex = -1;
    13. }
    14. type(text) {
    15. this.content += text;
    16. }
    17. save() {
    18. const memento = new EditorMemento(this.content);
    19. this.history.push(memento);
    20. this.currentIndex++;
    21. }
    22. undo() {
    23. if (this.currentIndex > 0) {
    24. this.currentIndex--;
    25. this.content = this.history[this.currentIndex].content;
    26. }
    27. }
    28. redo() {
    29. if (this.currentIndex < this.history.length - 1) {
    30. this.currentIndex++;
    31. this.content = this.history[this.currentIndex].content;
    32. }
    33. }
    34. }
    35. // 使用示例
    36. const editor = new Editor();
    37. editor.type('Hello');
    38. editor.save();
    39. console.log(editor.content); // 'Hello'
    40. editor.type(' World');
    41. editor.save();
    42. console.log(editor.content); // 'Hello World'
    43. editor.undo();
    44. console.log(editor.content); // 'Hello'
    45. editor.redo();
    46. console.log(editor.content); // 'Hello World'

    上述代码中,首先定义了一个EditorMemento类,表示编辑器的备忘录。备忘录对象保存了编辑器在某个状态下的内容。

    接下来定义了一个Editor类,表示编辑器对象。编辑器对象包含一个内容属性content,一个历史记录属性history,以及一个当前索引属性currentIndex

    编辑器对象提供了几个方法:

    • type(text):在编辑器中输入文本,将文本追加到内容属性中。
    • save():保存当前编辑器的状态,创建一个新的备忘录对象,并将其添加到历史记录中。同时更新当前索引的值。
    • undo():撤销上一次的操作,将当前索引减1,并将内容属性更新为上一次保存的备忘录中的内容。
    • redo():重做上一次撤销的操作,将当前索引加1,并将内容属性更新为下一次保存的备忘录中的内容。

    优缺点

    优点
    1. 提供了一种保存和恢复对象状态的方式,使得对象的状态管理更加灵活。
    2. 可以实现撤销和重做功能,提升用户体验。
    3. 不破坏封装性,保持了对象的内部状态的私有性。
    缺点
    1. 如果备忘录对象过多或者状态较大,会占用较大的内存空间。
    2. 备忘录模式会增加代码复杂度,需要额外维护备忘录对象和原始对象之间的关系。

    总结

    备忘录模式是一种有用的设计模式,在前端开发中可以应用于保存和恢复用户界面状态、实现撤销和重做功能等场景。通过封装对象状态并提供恢复机制,备忘录模式提高了代码灵活性和可维护性。然而,在使用备忘录模式时需要注意内存占用和代码复杂度等问题。

  • 相关阅读:
    【Flask从入门到精通:第一课:flask的基本介绍、flask快速搭建项目并运行】
    【第25例】IPD体系进阶:需求分析团队RAT
    软件性能测试学习笔记(LoadRunner):从零开始
    L1-035 情人节 c++解法
    基于java中的springboot框架实现经方药食两用服务平台项目演示【内附项目源码+论文说明】
    [springboot]jasypt加密
    spark sql cbo与rbo考量
    代码随想录算法训练营19期第53天
    自然语言处理(NLP)技术
    微信小程序中使用tabBar
  • 原文地址:https://blog.csdn.net/wanghongpu9305/article/details/133855351