设计模式-备忘录模式

概念

  • 随时记录一个对象的状态变化
  • 随时可以恢复之前的某个状态(如撤销功能)
  • 未找到JS中经典应用,除了一些工具(如编辑器)

演示

js 复制代码
// 状态备忘
class Memento {
    constructor(content) {
        this.content = content
    }
    getContent() {
        return this.content
    }
}

// 备忘列表
class CareTeker {
    constructor() {
        this.list = []
    }
    add(memento) {
        this.list.push(memento)
    }
    get(index) {
        return this.list[index]
    }
}

// 编辑器
class Editor {
    constructor() {
        this.content = null
    }
    setContent(content) {
        this.content = content
    }
    getContent() {
        return this.content
    }
    saveContentToMemento() {
        return new Memento(this.content)
    }
    getContentFromMemento(memento) {
        this.content = memento.getContent()
    }
}

// 测试代码
let editor = new Editor()
let careTaker = new CareTaker()
editor.setContent('111')
editor.setContent('222')
careTaker.add(editor.saveContentToMemento()) // 存储备忘录
editor.setContent('333')
careTaker.add(editor.saveContentToMemento()) // 存储备忘录
editor.setContent('444')

console.log(editor.getContent())
editor.getContentFromMemento(careTaker.get(1)) // 撤销
console.log(editor.getContent())
editor.getContentFromMemento(careTaker.get(0)) // 撤销
console.log(editor.getContent())

设计原则验证

  • 状态对象于使用者分开,解耦
  • 符合开放封闭原则
相关推荐
这是个栗子5 分钟前
前端开发中的常用工具函数(持续更新中...)
前端·javascript·算法
爱上妖精的尾巴7 分钟前
6-13 WPS JS宏 Map实例2--拆分记录到表格
javascript·restful·wps
雄鸡三声天下白14 分钟前
js复制文本到剪贴板,以及navigator.clipboard 会提示 is undefined
前端·javascript·数据库
Qin_jiangshan15 分钟前
flutter实现透明导航栏
前端·javascript·flutter
fengyucaihong_12317 分钟前
vue加声音播放
javascript·vue.js·ecmascript
鹏多多23 分钟前
前端纯js实现图片模糊和压缩
前端·javascript·vue.js
2501_9444417528 分钟前
Flutter&OpenHarmony商城App用户中心组件开发
java·javascript·flutter
花归去30 分钟前
Promise 包含的属性
开发语言·javascript·ecmascript
2501_9444460031 分钟前
Flutter&OpenHarmony主题切换功能实现
开发语言·javascript·flutter
C_心欲无痕38 分钟前
react - useReducer复杂状态管理
前端·javascript·react.js