1. Memento Pattern là gì
Memento Pattern là một mẫu thiết kế hành vi được sử dụng để lưu trữ và khôi phục trạng thái nội bộ của một đối tượng. Nó lưu trạng thái của đối tượng vào một đối tượng memento, có thể được sử dụng để khôi phục đối tượng về trạng thái trước đó trong tương lai.
2. Đặc điểm và Ưu điểm của Memento Pattern
Các đặc điểm và ưu điểm của Memento Pattern bao gồm:
- Nó có thể lưu trữ và khôi phục trạng thái nội bộ của một đối tượng mà không vi phạm nguyên tắc đóng gói.
- Nó có thể linh hoạt quản lý các trạng thái lịch sử của một đối tượng, việc thực hiện các hoạt động hoàn tác và làm lại trở nên thuận tiện.
- Nó cho phép lưu trạng thái bên ngoài, tránh việc tiết lộ trạng thái nội bộ của đối tượng.
3. Ví dụ về Ứng dụng Thực tế của Memento Pattern
Memento Pattern có nhiều kịch bản ứng dụng thực tế, một số ví dụ bao gồm:
- Chức năng undo và redo trong trình soạn thảo văn bản, có thể sử dụng Memento Pattern để lưu trạng thái của mỗi hoạt động.
- Chức năng lưu và tải trong trò chơi, có thể sử dụng Memento Pattern để lưu tiến trình của trò chơi.
- Chức năng lưu bản nháp trong các ứng dụng email, có thể sử dụng Memento Pattern để lưu trạng thái của bản nháp email.
4. Triển khai của Memento Pattern trong Golang
4.1. Sơ đồ Lớp UML
4.2. Giới thiệu Ví dụ
Mô tả Dựa trên Sơ đồ Lớp UML
Trong ví dụ này, chúng ta có một lớp Originator với trạng thái nội bộ được gọi là "state". Originator đặt trạng thái bằng cách sử dụng phương thức SetState và tạo một đối tượng memento bằng phương thức CreateMemento. Trạng thái nội bộ của đối tượng memento giống với của Originator. Lớp Caretaker chịu trách nhiệm lưu trữ đối tượng memento và thêm mementos bằng phương thức AddMemento.
Bước Triển khai
- Tạo đối tượng Memento, có phương thức GetState để lưu trạng thái nội bộ của Originator.
- Tạo đối tượng Originator, có các phương thức để đặt trạng thái và tạo một memento.
- Tạo đối tượng Caretaker, chịu trách nhiệm lưu trữ đối tượng memento.
- Triển khai các phương thức để tạo một memento và khôi phục trạng thái trong Originator: - Khi tạo đối tượng memento, lưu trạng thái của Originator trong memento. - Khi khôi phục trạng thái, khôi phục trạng thái từ memento về Originator.
- Triển khai các phương thức để thêm một memento và lấy một memento trong Caretaker: - Phương thức thêm memento được sử dụng để lưu trữ đối tượng memento trong Caretaker. - Phương thức lấy memento được sử dụng để lấy đối tượng memento từ Caretaker.
4.3.1. Tạo Đối tượng Memento
type Memento struct {
state string
}
func (m *Memento) GetState() string {
return m.state
}
4.3.2. Lưu Trạng Thái trong Memento
type Originator struct {
state string
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state}
}
4.3.3. Khôi phục Trạng Thái từ Memento
func (o *Originator) SetMemento(memento *Memento) {
o.state = memento.GetState()
}
4.3.4. Sử dụng Memento Pattern cho Hoạt động Undo
type Caretaker struct {
mementos []*Memento
}
func (c *Caretaker) AddMemento(m *Memento) {
c.mementos = append(c.mementos, m)
}
func (c *Caretaker) GetMemento(index int) *Memento {
return c.mementos[index]
}
4.3.5. Sử dụng Mẫu Memento cho Các Hoạt Động Làm Lại
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("Trạng thái 1")
caretaker.AddMemento(originator.CreateMemento())
originator.SetState("Trạng thái 2")
caretaker.AddMemento(originator.CreateMemento())
originator.SetMemento(caretaker.GetMemento(0))
fmt.Println("Trạng thái của Originator sau khi khôi phục về trạng thái 1:", originator.state)
originator.SetMemento(caretaker.GetMemento(1))
fmt.Println("Trạng thái của Originator sau khi khôi phục về trạng thái 2:", originator.state)
}