Design Patterns2023-02-093 min read
Design Patterns – Memento Pattern
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.
Nguyen Pham
•Xin chào. Mình thích lập trình và công nghệ. Đây là blog mình chia sẻ lại các kiến thức về lập trình, công nghệ.
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à:
- Tạo một đối tượng để lưu trạng thái của đối tượng khác, gọi là “Memento”.
- 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.
- 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.
- 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
codepackage 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
codepackage 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
codepackage 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
codepackage 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 } }
Tags:#Design Patterns#design-pattern