Menurut saya, UNDO / REDO dapat diimplementasikan dalam 2 cara secara luas. 1. Command Level (disebut command level Undo / Redo) 2. Tingkat dokumen (disebut global Undo / Redo)
Tingkat perintah: Seperti yang ditunjukkan oleh banyak jawaban, ini dicapai secara efisien dengan menggunakan pola Memento. Jika perintah juga mendukung penjurnalan tindakan, pengulangan mudah didukung.
Batasan: Setelah cakupan perintah keluar, undo / redo tidak mungkin dilakukan, yang mengarah ke tingkat dokumen (global) undo / redo
Saya kira kasus Anda akan cocok dengan undo / redo global karena cocok untuk model yang melibatkan banyak ruang memori. Selain itu, ini juga cocok untuk membatalkan / mengulang secara selektif. Ada dua tipe primitif
- Semua memori dibatalkan / ulangi
- Tingkat objek Urungkan Ulangi
Dalam "Semua memori Undo / Ulangi", seluruh memori diperlakukan sebagai data yang terhubung (seperti pohon, atau daftar atau grafik) dan memori dikelola oleh aplikasi daripada OS. Jadi operator baru dan hapus jika di C ++ kelebihan beban untuk memuat struktur yang lebih spesifik untuk mengimplementasikan operasi secara efektif seperti a. Jika ada node yang dimodifikasi, b. memegang dan membersihkan data, dll., Cara fungsinya pada dasarnya adalah menyalin seluruh memori (dengan asumsi bahwa alokasi memori sudah dioptimalkan dan dikelola oleh aplikasi menggunakan algoritme lanjutan) dan menyimpannya dalam tumpukan. Jika salinan memori diminta, struktur pohon disalin berdasarkan kebutuhan untuk memiliki salinan yang dangkal atau dalam. Salinan dalam dibuat hanya untuk variabel yang dimodifikasi. Karena setiap variabel dialokasikan menggunakan alokasi khusus, aplikasi memiliki keputusan akhir kapan harus menghapusnya jika perlu. Hal-hal menjadi sangat menarik jika kita harus mempartisi Undo / Redo ketika kebetulan kita perlu Undo / Redo secara selektif programatik satu set operasi. Dalam hal ini, hanya variabel baru tersebut, atau variabel yang dihapus atau variabel yang dimodifikasi yang diberi tanda sehingga Undo / Redo hanya membatalkan / mengulang memori tersebut. Hal-hal menjadi lebih menarik jika kita perlu melakukan sebagian Undo / Redo di dalam suatu objek. Jika demikian, gagasan baru tentang "Pola pengunjung" digunakan. Ini disebut "Undo / Ulangi Tingkat Objek" atau variabel yang dihapus atau variabel yang dimodifikasi diberi tanda sehingga Undo / Redo hanya membatalkan / mengulang memori tersebut. Hal-hal menjadi lebih menarik jika kita perlu melakukan sebagian Urungkan / Ulangi di dalam suatu objek. Jika demikian, gagasan baru tentang "Pola pengunjung" digunakan. Ini disebut "Undo / Ulangi Tingkat Objek" atau variabel yang dihapus atau variabel yang dimodifikasi diberi tanda sehingga Undo / Redo hanya membatalkan / mengulang memori tersebut. Hal-hal menjadi lebih menarik jika kita perlu melakukan sebagian Urungkan / Ulangi di dalam suatu objek. Jika demikian, gagasan baru tentang "Pola pengunjung" digunakan. Ini disebut "Undo / Ulangi Tingkat Objek"
- Tingkat objek Undo / Redo: Ketika pemberitahuan untuk membatalkan / mengulang dipanggil, setiap objek mengimplementasikan operasi streaming dimana, streamer mendapatkan dari objek data lama / data baru yang diprogram. Data yang tidak akan diganggu dibiarkan tidak terganggu. Setiap objek mendapat streamer sebagai argumen dan di dalam panggilan UNDo / Redo, itu mengalirkan / melepaskan data dari objek.
Baik 1 dan 2 bisa memiliki metode seperti 1. BeforeUndo () 2. AfterUndo () 3. BeforeRedo () 4. AfterRedo (). Metode ini harus diterbitkan dalam Perintah Batalkan / ulangi dasar (bukan perintah kontekstual) sehingga semua objek menerapkan metode ini juga untuk mendapatkan tindakan tertentu.
Strategi yang baik adalah membuat gabungan dari 1 dan 2. Yang menarik adalah bahwa metode ini (1 & 2) sendiri menggunakan pola perintah