Site icon 2k1

Design Patterns – Memento Pattern

Giới thiệu

Memento Pattern là một kiểu thiết kế trong lập trình hướng đối tượng (Object-Oriented Programming) cho phép bạn lưu lại trạng thái của một đối tượng và sau đó phục hồi trạng thái đó một cách dễ dàng. Điều này cho phép bạn tái sử dụng trạng thái cũ của đối tượng mà không cần phải tìm hiểu lại tất cả thông tin về nó.

Các bước chính để áp dụng Memento pattern là:

  1. Tạo một đối tượng để lưu trạng thái của đối tượng khác, gọi là “Memento”.
  2. Tạo một đối tượng “Caretaker” để quản lý các Mementovà chịu trách nhiệm phục hồi trạng thái của đối tượng.
  3. Khi cần lưu trạng thái của đối tượng, hãy tạo một Momento và gửi nó đến Caretaker.
  4. Khi cần phục hồi trạng thái, hãy yêu cầu Caretaker trả lại Mementotương ứng và sử dụng nó để khôi phục trạng thái của đối tượng.

Momento Pattern cung cấp một cách linh hoạt và dễ dàng để quản lý trạng thái của một đối tượng và phục hồi nó.

Code

Bước 1. Tạo class memento

EditorState.java

package momento;

// Momento class
// Class để lưu trữ trạng thái đối tượng khác
public class EditorState {
    private final String content; // State của class Originator

    // constructor
    public EditorState(String content) {
        this.content = content;
    }
    public String getContent() {
        return content;
    }

}

Bước 2. Tạo class Originator

Editor.java

package momento;

// Originator class
public class Editor {
    private String content; // state

    // CreateMemento object -> use Memento Class
    public EditorState createState(){
        return new EditorState(content);
    }

    // setMemento
    public void restore(EditorState state){
        content = state.getContent();
    }


    // State get/set
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Bước 3. Tạo class CareTaker

History.java

package momento;

import java.util.ArrayList;
import java.util.List;

// Caretaker
public class History {
    private List<EditorState> states = new ArrayList<>(); // Lưu trữ lại lịch sử

    // Push state -> Memento
    public void push(EditorState state){
        states.add(state);
    }


    // Pop state
    public EditorState pop(){
        var lastIndex = states.size() - 1;
        var lastState = states.get(lastIndex);
        states.remove(lastState);
        return  lastState;

    }
}

Bước 4. Sử dụng

Main.java

package momento;

public class Main {
    public static void main(String[] args) {
        var editor = new Editor(); // create originator
        var history  = new History(); // create caretaker

        editor.setContent("a"); // update state originator
        history.push(editor.createState()); // create momento sau đó gửi tới caretaker

        editor.setContent("b");
        history.push(editor.createState());

        editor.setContent("c");
        editor.restore(history.pop()); // restore state: Yêu cầu caretaker trả về một object momento(EditorState) rồi sau đó update lại vào originator class

        System.out.println(editor.getContent()); // output: b

    }
}

Exit mobile version