前端設計模式——備忘錄模式

2023-03-23 12:08:40

備忘錄模式(Memento Pattern):是一種行為型設計模式,在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。在JavaScript中,可以使用閉包來實現備忘錄模式。

備忘錄模式通常用於處理使用者介面的狀態。當用戶與應用程式互動時,應用程式會根據使用者的輸入更改其狀態。它可以使您儲存和還原應用程式狀態的快照,以便使用者可以隨時返回以前的狀態。

以下是備忘錄模式的幾個關鍵元件:

1. Originator(發起人):負責建立要儲存狀態的物件,並在需要時將其狀態儲存到 Memento 中。
1. Memento(備忘錄):儲存發起人物件的狀態。
1. Caretaker(管理者):負責儲存和管理 Memento 物件。Caretaker 物件不會直接存取 Memento 物件,而是通過發起人物件來獲取它。

在前端中,備忘錄模式的一個實際應用是瀏覽器歷史記錄。當用戶在瀏覽器中導航時,瀏覽器將當前頁面的狀態儲存到歷史記錄中。使用者可以隨時返回以前的狀態,並恢復頁面的先前狀態。

下面是一個簡單的備忘錄模式實現範例:

// Originator
class Editor {
  constructor() {
    this.content = '';
  }

  type(words) {
    this.content += words;
  }

  save() {
    return new EditorMemento(this.content);
  }

  restore(memento) {
    this.content = memento.getContent();
  }
}

// Memento
class EditorMemento {
  constructor(content) {
    this.content = content;
  }

  getContent() {
    return this.content;
  }
}

// Caretaker
class History {
  constructor() {
    this.states = [];
  }

  push(state) {
    this.states.push(state);
  }

  pop() {
    return this.states.pop();
  }
}

// Usage
const editor = new Editor();
const history = new History();

// 編輯器輸入內容
editor.type('Hello, ');
editor.type('World!');

// 將當前狀態儲存到備忘錄中,並將備忘錄新增到歷史記錄中
history.push(editor.save());

// 繼續編輯器輸入內容
editor.type(' How are you today?');

// 輸出當前編輯器內容
console.log(editor.content); // 'Hello, World! How are you today?'

// 從歷史記錄中恢復上一個狀態
editor.restore(history.pop());

// 輸出恢復的編輯器內容
console.log(editor.content); // 'Hello, World!'

 

在這個例子中,`Editor` 類是發起人,它具有儲存和恢復狀態的方法。`EditorMemento` 類是備忘錄,它儲存發起人物件的狀態。`History` 類是管理者,它儲存和管理備忘錄物件。

在使用備忘錄模式時,我們首先建立一個編輯器物件 `editor`,並將其狀態儲存到歷史記錄中。然後我們繼續輸入一些內容,並再次將狀態儲存到歷史記錄中。接著,我們從歷史記錄中恢復先前的狀態,並輸出恢復的編輯器內容。

需要注意的是,在 JavaScript 中,我們可以直接存取物件的屬性,而不需要使用 getter 和 setter 方法,因此在上面的範例中,我們可以直接使用 `editor.content` 來存取編輯器的內容。