【设计模式】之备忘录模式

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

✨ 专栏介绍

设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模式,并学习如何将它们应用于实际项目中。通过掌握这些设计模式,我们可以编写更优雅、可靠且易于维护的前端代码。

本文主要讲解行为型模式中的备忘录模式


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

备忘录模式特性:

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

应用示例

1. 保存表单数据:

// 备忘录classFormMemento {
constructor(state) {
this.state=state;
  }
}
// 原始对象classForm {
constructor() {
this.state= {};
  }
save() {
returnnewFormMemento(this.state);
  }
restore(memento) {
this.state=memento.state;
  }
}
// 使用示例constform=newForm();
form.state= { name: 'John', age: 25 };
constmemento=form.save();
form.state= { name: 'Alice', age: 30 };
form.restore(memento);
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对象中。
  1. 使用示例:首先,创建一个新的Form对象。然后,设置其状态,调用save()方法保存当前状态,更改状态,最后使用restore()方法恢复到之前保存的状态。

2. 撤销和重做功能

// 备忘录classEditorMemento {
constructor(content) {
this.content=content;
  }
}
// 原始对象classEditor {
constructor() {
this.content='';
this.history= [];
this.currentIndex=-1;
  }
type(text) {
this.content+=text;
  }
save() {
constmemento=newEditorMemento(this.content);
this.history.push(memento);
this.currentIndex++;
  }
undo() {
if (this.currentIndex>0) {
this.currentIndex--;
this.content=this.history[this.currentIndex].content;
    }
  }
redo() {
if (this.currentIndex<this.history.length-1) {
this.currentIndex++;
this.content=this.history[this.currentIndex].content;
    }
  }
}
// 使用示例consteditor=newEditor();
editor.type('Hello');
editor.save();
console.log(editor.content); // 'Hello'editor.type(' World');
editor.save();
console.log(editor.content); // 'Hello World'editor.undo();
console.log(editor.content); // 'Hello'editor.redo();
console.log(editor.content); // 'Hello World'

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

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

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

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

优缺点

优点

  1. 提供了一种保存和恢复对象状态的方式,使得对象的状态管理更加灵活。
  2. 可以实现撤销和重做功能,提升用户体验。
  3. 不破坏封装性,保持了对象的内部状态的私有性。

缺点

  1. 如果备忘录对象过多或者状态较大,会占用较大的内存空间。
  2. 备忘录模式会增加代码复杂度,需要额外维护备忘录对象和原始对象之间的关系。

总结

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


目录
相关文章
|
7月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
87 0
|
7月前
|
设计模式 存储 Java
【设计模式】备忘录模式
【设计模式】备忘录模式
|
7月前
|
设计模式 存储 Java
浅谈设计模式 - 备忘录模式(十五)
浅谈设计模式 - 备忘录模式(十五)
47 0
|
7月前
|
设计模式 存储 Java
Java设计模式【十九】:备忘录模式
Java设计模式【十九】:备忘录模式
41 0
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
4月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
6月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
5月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
6月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
7月前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
154 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    58
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    54
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121