Corak Reka Bentuk Memento di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan mengetahui apa itu Pola Reka Bentuk Memento dan cara menggunakannya.

Pertama, kita akan mengkaji sedikit teori. Kemudian, kami akan membuat contoh di mana kami akan menggambarkan penggunaan corak.

2. Apakah Corak Reka Bentuk Memento?

Corak Reka Bentuk Memento, yang digambarkan oleh Gang of Four dalam buku mereka, adalah corak reka bentuk tingkah laku. Pola Reka Bentuk Memento menawarkan penyelesaian untuk melaksanakan tindakan yang tidak boleh ditolak. Kita dapat melakukan ini dengan menyelamatkan keadaan objek pada waktu tertentu dan memulihkannya jika tindakan yang dilakukan sejak itu perlu dibatalkan.

Secara praktikal, objek yang keadaannya perlu disimpan disebut Pemula. Caretaker adalah objek yang memicu penyelamatan dan pemulihan keadaan, yang disebut Memento.

Objek Memento harus mendedahkan sedikit sebanyak maklumat kepada Caretaker. Ini untuk memastikan bahawa kita tidak mendedahkan keadaan dalaman Pemula ke dunia luar, kerana ia akan melanggar prinsip enkapsulasi. Walau bagaimanapun, Pemula harus mengakses maklumat yang mencukupi untuk mengembalikan ke keadaan asal.

Mari lihat rajah kelas cepat yang menggambarkan bagaimana objek berbeza saling berinteraksi antara satu sama lain:

Seperti yang kita lihat, Originator dapat menghasilkan dan memakan Memento. Sementara itu, Pengasuh hanya menjaga negeri sebelum memulihkannya. Perwakilan dalaman Pencipta dirahsiakan dari dunia luar.

Di sini, kami menggunakan satu bidang untuk mewakili keadaan Pemula, walaupun kami tidak terbatas pada satu bidang dan mungkin menggunakan sebilangan bidang yang diperlukan . Selain itu, keadaan yang berada dalam objek Memento tidak harus sesuai dengan keadaan penuh Pemula. Selagi maklumat yang disimpan mencukupi untuk memulihkan keadaan Pemula, kita harus terus maju.

3. Bilakah Menggunakan Corak Reka Bentuk Memento?

Biasanya, Pola Reka Bentuk Memento akan digunakan dalam situasi di mana beberapa tindakan tidak dapat dilakukan, oleh itu memerlukan pemulangan ke keadaan sebelumnya. Namun, jika keadaan Originator berat, penggunaan Memento Design Pattern boleh menyebabkan proses penciptaan yang mahal dan peningkatan penggunaan memori.

4. Contoh Corak Memento

4.1. Contoh Permulaan

Sekarang mari kita lihat contoh Corak Reka Bentuk Memento. Cuba bayangkan kita mempunyai editor teks:

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

Ia mempunyai tetingkap teks, yang menyimpan teks yang sedang 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, bayangkan kita mahu editor teks kita melaksanakan beberapa ciri simpan dan buat asal. Semasa menyimpan, kami mahu teks semasa kami disimpan. Oleh itu, apabila membuat perubahan seterusnya, teks yang disimpan akan dipulihkan.

Untuk melakukannya, kami akan menggunakan Corak Reka Bentuk Memento. Pertama, kami akan membuat objek yang memegang teks tetingkap semasa:

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 kita lihat, kita memilih untuk menggunakan String dan bukannya StringBuilder untuk mengelakkan sebarang kemas kini teks semasa oleh orang luar.

4.3. Pencetus

Selepas itu, kita harus menyediakan kaedah TextWindow untuk membuat dan menggunakan objek Memento, menjadikan TextWindow sebagai Pemula kami:

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

Kaedah save () membolehkan kita membuat objek, sementara kaedah restore () menggunakannya untuk memulihkan keadaan sebelumnya.

4.4. Pengasuh

Akhirnya, kita harus mengemas kini kelas TextEditor kita . Sebagai Pengasuh, ia akan memegang status Pemula dan meminta untuk memulihkannya apabila diperlukan:

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

4.5. Menguji Penyelesaiannya

Mari kita lihat sama ada ia berfungsi melalui contoh sampel. Bayangkan kita menambah sedikit teks ke editor kita, menyimpannya, kemudian menambahkannya lagi dan, akhirnya, buat asal. Untuk mencapainya, kami akan menambahkan kaedah cetak () pada TextEditor kami yang mengembalikan rentetan teks semasa:

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 kita lihat, kalimat terakhir bukan sebahagian daripada teks semasa, kerana Memento telah disimpan sebelum menambahkannya.

5. Kesimpulan

Dalam artikel pendek ini, kami menerangkan Corak Reka Bentuk Memento dan untuk apa ia boleh digunakan. Kami juga melalui contoh yang menggambarkan penggunaannya dalam penyunting teks ringkas.

Kod penuh yang digunakan dalam artikel ini boleh didapati di GitHub.