Pola Desain Memento di Jawa

1. Ikhtisar

Dalam tutorial ini, kita akan mempelajari apa itu Memento Design Pattern dan bagaimana menggunakannya.

Pertama, kita akan membahas sedikit teori. Kemudian, kami akan membuat contoh di mana kami akan mengilustrasikan penggunaan pola.

2. Apa Itu Pola Desain Memento?

Pola Desain Memento, dijelaskan oleh Gang of Four dalam buku mereka, adalah pola desain perilaku. Pola Desain Memento menawarkan solusi untuk mengimplementasikan tindakan yang tidak dapat dilakukan. Kita dapat melakukan ini dengan menyimpan status objek pada saat tertentu dan memulihkannya jika tindakan yang dilakukan perlu dibatalkan.

Secara praktis, objek yang perlu diselamatkan statusnya disebut Originator. Pengurus adalah objek yang memicu penyelamatan dan pemulihan negara, yang disebut Memento.

Objek Memento harus memberikan informasi sesedikit mungkin kepada Pengurus. Ini untuk memastikan bahwa kami tidak mengekspos keadaan internal Pemrakarsa ke dunia luar, karena akan merusak prinsip-prinsip enkapsulasi. Namun, Originator harus mengakses informasi yang cukup untuk mengembalikan ke keadaan semula.

Mari kita lihat diagram kelas cepat yang mengilustrasikan bagaimana objek yang berbeda berinteraksi satu sama lain:

Seperti yang bisa kita lihat, Pencipta dapat memproduksi dan mengkonsumsi Memento. Sedangkan Caretaker hanya menjaga keadaan sebelum memulihkannya. Representasi internal dari Pencipta dirahasiakan dari dunia luar.

Di sini, kami menggunakan satu bidang untuk mewakili keadaan Originator, meskipun kami tidak terbatas pada satu bidang dan dapat menggunakan bidang sebanyak yang diperlukan . Selain itu, status yang ada di objek Memento tidak harus sama dengan status penuh dari Originator. Selama informasi yang disimpan cukup untuk memulihkan keadaan Originator, kami siap untuk pergi.

3. Kapan Menggunakan Pola Desain Memento?

Biasanya, Pola Desain Memento akan digunakan dalam situasi di mana beberapa tindakan tidak dapat dilakukan, oleh karena itu perlu melakukan rollback ke keadaan sebelumnya. Namun, jika status Originator berat, menggunakan Pola Desain Memento dapat menyebabkan proses pembuatan yang mahal dan peningkatan penggunaan memori.

4. Contoh Pola Memento

4.1. Sampel Awal

Sekarang mari kita lihat contoh Pola Desain Memento. Bayangkan kita memiliki editor teks:

public class TextEditor { private TextWindow textWindow; public TextEditor(TextWindow textWindow) { this.textWindow = textWindow; } }

Ini memiliki jendela teks, yang menampung teks yang saat ini dimasukkan, dan menyediakan cara untuk menambahkan lebih banyak teks:

public class TextWindow { private StringBuilder currentText; public TextWindow() { this.currentText = new StringBuilder(); } public void addText(String text) { currentText.append(text); } }

4.2. Memento

Sekarang, mari kita bayangkan kita ingin editor teks kita menerapkan beberapa fitur simpan dan batalkan. Saat menyimpan, kami ingin teks kami saat ini disimpan. Jadi, saat membatalkan perubahan berikutnya, teks yang kita simpan akan dipulihkan.

Untuk melakukan itu, kita akan menggunakan Pola Desain Memento. Pertama, kita akan membuat objek yang menahan teks jendela saat ini:

public class TextWindowState { private String text; public TextWindowState(String text) { this.text = text; } public String getText() { return text; } }

Objek ini adalah Memento kami. Seperti yang bisa kita lihat, kita memilih untuk menggunakan String daripada StringBuilder untuk mencegah pembaruan teks saat ini oleh orang luar.

4.3. Pencipta

Setelah itu, kita harus menyediakan kelas TextWindow dengan metode untuk membuat dan menggunakan objek Memento, menjadikan TextWindow Originator kita:

public TextWindowState save() { return new TextWindowState(wholeText.toString()); } public void restore(TextWindowState save) { currentText = new StringBuilder(save.getText()); }

Metode save () memungkinkan kita untuk membuat objek, sementara metode restore () menggunakannya untuk memulihkan keadaan sebelumnya.

4.4. Penjaga

Terakhir, kita harus memperbarui kelas TextEditor kita . Sebagai Pengurus, ia akan memegang status Originator dan meminta untuk mengembalikannya bila diperlukan:

private TextWindowState savedTextWindow; public void hitSave() { savedTextWindow = textWindow.save(); } public void hitUndo() { textWindow.restore(savedTextWindow); }

4.5. Menguji Solusi

Mari kita lihat apakah itu berfungsi melalui contoh run. Bayangkan kita menambahkan beberapa teks ke editor kita, menyimpannya, lalu menambahkan lagi dan, akhirnya, batalkan. Untuk mencapai itu, kami akan menambahkan metode print () pada TextEditor kami yang mengembalikan String dari teks saat ini:

TextEditor textEditor = new TextEditor(new TextWindow()); textEditor.write("The Memento Design Pattern\n"); textEditor.write("How to implement it in Java?\n"); textEditor.hitSave(); textEditor.write("Buy milk and eggs before coming home\n"); textEditor.hitUndo(); assertThat(textEditor.print()).isEqualTo("The Memento Design Pattern\nHow to implement it in Java?\n");

Seperti yang bisa kita lihat, kalimat terakhir bukanlah bagian dari teks saat ini, karena Memento disimpan sebelum menambahkannya.

5. Kesimpulan

Dalam artikel singkat ini, kami menjelaskan Pola Desain Memento dan apa kegunaannya. Kami juga melihat contoh yang menggambarkan penggunaannya dalam editor teks sederhana.

Kode lengkap yang digunakan dalam artikel ini dapat ditemukan di GitHub.