1. แบบแผน Memento คืออะไร

แบบแผน Memento เป็นแบบแผนออกแบบที่ใช้สำหรับบันทึกและกู้คืนสถานะภายในของอ็อบเจ็กต์ได้ เขาบันทึกสถานะของอ็อบเจ็กต์ไปยังอ็อบเจ็กต์ Memento ซึ่งสามารถใช้เพื่อกู้คืนอ็อบเจ็กต์ไปสู่สถานะก่อนหน้าในอนาคตได้

2. ลักษณะและข้อดีของแบบแผน Memento

ลักษณะและข้อดีของแบบแผน Memento ประกอบด้วย:

  • สามารถบันทึกและกู้คืนสถานะภายในอ็อบเจ็กต์โดยไม่ละเมิดหลักการการซ่อนแยกของข้อมูล
  • สามารถจัดการสถานะที่เกี่ยวกับประวัติของอ็อบเจ็กต์ได้อย่างยืดหยุ่น ทำให้สะดวกต่อการดำเนินการเพื่อยกเลิกและทำซ้ำ
  • อนุญาตให้บันทึกสถานะภายนอกเพื่อป้องกันการเปิดเผยสถานะภายในของอ็อบเจ็กต์

3. ตัวอย่างการประยุกต์ใช้แบบแผน Memento ในทางปฏิบัติ

แบบแผน Memento มีฉบับที่ใช้ในสถานการณ์การประยุกต์ที่หลากหลาย ตัวอย่างบางตัวอย่างมีดังนี้:

  • ฟังก์ชันการยกเลิกและทำซ้ำในตัวแก้ไขข้อความ โดยที่การประยุกต์ใช้แบบแผน Memento เพื่อบันทึกสถานะของแต่ละการดำเนินการ
  • ฟังก์ชันการบันทึกและโหลดในเกม โดยซึ่งสามารถใช้แบบแผน Memento เพื่อบันทึกความคืบหน้าของเกม
  • คุณลักษณะการจัดเก็บดราฟในไคลเอนต์อีเมล โดยสามารถใช้แบบแผน Memento เพื่อบันทึกสถานะของการร่างอีเมล

4. การปรับใช้แบบแผน Memento ใน Golang

4.1. แผนภาพคลาส UML

แบบแผน Memento ใน Golang

4.2. คำอธิบายตัวอย่าง

คำอธิบายขึ้นอยู่กับแผนภาพคลาส UML

ในตัวอย่างนี้ เรามีคลาส Originator ซึ่งมีสถานะภายในที่เรียกว่า "state" อ็อบเจ็กต์ Originator จะตั้งค่าสถานะโดยใช้เมธอด SetState และสร้างอ็อบเจ็กต์ memento โดยใช้เมธอด CreateMemento สถานะภายในของอ็อบเจ็กต์ Memento จะเหมือนกับอ็อบเจ็กต์ Originator คลาส Caretaker รับผิดชอบการเก็บอ็อบเจ็กต์ memento และเพิ่มดราฟด้วยเมธอด AddMemento

ขั้นตอนการปฏิบัติ

  1. สร้างอ็อบเจ็กต์ Memento ซึ่งมีเมธอด GetState เพื่อบันทึกสถานะภายในของ Originator
  2. สร้างอ็อบเจ็กต์ Originator ซึ่งมีเมธอดที่ใช้เพื่อตั้งค่าสถานะและสร้าง memento
  3. สร้างอ็อบเจ็กต์ Caretaker ซึ่งรับผิดชอบการเก็บอ็อบเจ็กต์ memento
  4. ปฏิบัติเมธอดเพื่อสร้าง memento และกู้คืนสถานะภายใน Originator:
    • เมื่อสร้างอ็อบเจ็กต์ memento ให้บันทึกสถานะของ Originator ใน memento
    • เมื่อกู้คืนสถานะ ให้กู้คืนสถานะจาก memento ไปยัง Originator
  5. ปฏิบัติเมธอดเพื่อเพิ่ม memento และรับ memento ใน Caretaker:
    • เมธอด add memento ใช้เพื่อบันทึกอ็อบเจ็กต์ memento ใน Caretaker
    • เมธอด get memento ใช้เพื่อเรียกดูอ็อบเจ็กต์ memento จาก Caretaker

4.3.1. สร้างอ็อบเจ็กต์ Memento

type Memento struct {
	state string
}

func (m *Memento) GetState() string {
	return m.state
}

4.3.2. เก็บสถานะในอ็อบเจ็กต์ 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. กู้คืนสถานะจากอ็อบเจ็กต์ Memento

func (o *Originator) SetMemento(memento *Memento) {
	o.state = memento.GetState()
}

4.3.4. ใช้แบบแผน Memento สำหรับการดำเนินการยกเลิก

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. การใช้รูปแบบ Memento สำหรับการดำเนินการ Redo

func main() {
	originator := &Originator{}
	caretaker := &Caretaker{}

	originator.SetState("สถานะ 1")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetState("สถานะ 2")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetMemento(caretaker.GetMemento(0))
	fmt.Println("สถานะของ Originator หลังกู้คืนไปสู่สถานะ 1:", originator.state)

	originator.SetMemento(caretaker.GetMemento(1))
	fmt.Println("สถานะของ Originator หลังกู้คืนไปสู่สถานะ 2:", originator.state)
}