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
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
}
}