1. Apa itu Pola Memento

Pola Memento adalah pola desain perilaku yang digunakan untuk menyimpan dan mengembalikan keadaan internal suatu objek. Pola ini menyimpan keadaan objek ke objek memento, yang dapat digunakan untuk mengembalikan objek ke keadaan sebelumnya di masa depan.

2. Karakteristik dan Keuntungan Pola Memento

Karakteristik dan keuntungan dari Pola Memento meliputi:

  • Dapat menyimpan dan mengembalikan keadaan internal suatu objek tanpa melanggar prinsip enkapsulasi.
  • Dapat mengelola secara fleksibel keadaan-keadaan historis suatu objek, sehingga memudahkan untuk melakukan operasi undo dan redo.
  • Memungkinkan keadaan untuk disimpan secara eksternal, menghindari paparan keadaan internal objek.

3. Contoh Aplikasi Praktis dari Pola Memento

Pola Memento memiliki berbagai skenario aplikasi praktis, beberapa contohnya meliputi:

  • Fungsi undo dan redo dalam editor teks, yang dapat menggunakan Pola Memento untuk menyimpan keadaan setiap operasi.
  • Fungsi simpan dan muat dalam permainan, yang dapat menggunakan Pola Memento untuk menyimpan kemajuan permainan.
  • Fitur penyimpanan draf dalam klien email, yang dapat menggunakan Pola Memento untuk menyimpan keadaan email draf.

4. Implementasi Pola Memento dalam Golang

4.1. Diagram Kelas UML

Pola Memento dalam Golang

4.2. Pengantar Contoh

Deskripsi Berdasarkan Diagram Kelas UML

Pada contoh ini, kita memiliki kelas Originator dengan keadaan internal bernama "state". Originator mengatur keadaan menggunakan metode SetState dan membuat objek memento menggunakan metode CreateMemento. Keadaan internal objek memento sama dengan Originator. Kelas Caretaker bertanggung jawab untuk menyimpan objek memento dan menambahkan memento menggunakan metode AddMemento.

Langkah-langkah Implementasi

  1. Membuat objek Memento, yang memiliki metode GetState untuk menyimpan keadaan internal Originator.
  2. Membuat objek Originator, yang memiliki metode untuk mengatur keadaan dan membuat memento.
  3. Membuat objek Caretaker, yang bertanggung jawab untuk menyimpan objek memento.
  4. Mengimplementasikan metode untuk membuat memento dan mengembalikan keadaan di Originator:
    • Saat membuat objek memento, simpan keadaan Originator di memento.
    • Saat mengembalikan keadaan, kembalikan keadaan dari memento ke Originator.
  5. Mengimplementasikan metode untuk menambahkan memento dan mendapatkan memento di Caretaker:
    • Metode tambahkan memento digunakan untuk menyimpan objek memento di Caretaker.
    • Metode dapatkan memento digunakan untuk mengambil objek memento dari Caretaker.

4.3.1. Membuat Objek Memento

type Memento struct {
	state string
}

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

4.3.2. Menyimpan Keadaan dalam 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. Mengembalikan Keadaan dari Memento

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

4.3.4. Menggunakan Pola Memento untuk Operasi 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. Menggunakan Pola Memento untuk Operasi Redo

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

	originator.SetState("State 1")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetState("State 2")
	caretaker.AddMemento(originator.CreateMemento())

	originator.SetMemento(caretaker.GetMemento(0))
	fmt.Println("Status asal setelah dipulihkan ke state 1:", originator.state)

	originator.SetMemento(caretaker.GetMemento(1))
	fmt.Println("Status asal setelah dipulihkan ke state 2:", originator.state)
}