Bence, UNDO / REDO genel olarak 2 şekilde uygulanabilir. 1. Komut Düzeyi (komut düzeyi Geri Al / Yinele olarak adlandırılır) 2. Belge düzeyi (genel Geri Al / Yinele olarak adlandırılır)
Komut seviyesi: Birçok cevabın işaret ettiği gibi, bu Memento kalıbı kullanılarak verimli bir şekilde başarılır. Komut ayrıca eylemi günlüğe kaydetmeyi destekliyorsa, yineleme kolayca desteklenir.
Sınırlama: Komutun kapsamı bir kez çıkarıldığında, geri alma / yineleme imkansızdır, bu da belge düzeyinde (genel) geri alma / yineleme
Çok fazla bellek alanı içeren bir model için uygun olduğu için durumunuzun genel geri alma / yineleme sürecine uyacağını tahmin ediyorum. Ayrıca bu, seçici olarak geri almak / yinelemek için de uygundur. İki ilkel tür vardır
- Tüm bellek geri al / yinele
- Nesne düzeyinde Geri Al Yinele
"Tüm bellek Geri Al / Yinele" de, belleğin tamamı bağlı bir veri (bir ağaç veya liste veya grafik gibi) olarak kabul edilir ve bellek, işletim sistemi yerine uygulama tarafından yönetilir. Bu yüzden yeni ve silme operatörleri, C ++ 'da ise,. Herhangi bir düğüm değiştirilirse, b. verileri tutma ve temizleme vb. İşleyiş şekli temelde tüm belleği kopyalamak (bellek tahsisinin gelişmiş algoritmalar kullanılarak uygulama tarafından zaten optimize edildiği ve yönetildiği varsayılarak) ve bir yığın halinde saklamaktır. Hafızanın kopyası istenirse sığ veya derin kopyası olması ihtiyacına göre ağaç yapısı kopyalanır. Yalnızca değiştirilen değişken için derin bir kopya yapılır. Her değişken özel ayırma kullanılarak tahsis edildiğinden, Uygulama, gerektiğinde onu ne zaman sileceğine dair son söze sahiptir. Geri Al / Yinele'yi bölümlere ayırmak zorunda kalırsak, programatik olarak seçici bir şekilde bir işlem kümesini Geri Al / Yinele'ye ihtiyaç duyarsak işler çok ilginç hale gelir. Bu durumda, yalnızca bu yeni değişkenlere veya silinmiş değişkenlere veya değiştirilmiş değişkenlere bir bayrak verilir, böylece Geri Al / Yinele yalnızca bu belleği geri alır / yeniden yapar Bir nesnenin içinde kısmi bir Geri Al / Yinele yapmamız gerekirse, işler daha da ilginç hale gelir. Böyle bir durumda, daha yeni bir "Ziyaretçi kalıbı" fikri kullanılır. Buna "Nesne Düzeyinde Geri Al / Yinele" denir veya silinmiş değişkenlere veya değiştirilmiş değişkenlere bir bayrak verilir, böylece Geri Al / Yinele yalnızca bu belleği geri alır / yeniden yapar Bir nesnenin içinde kısmi bir Geri Al / Yinele yapmamız gerekirse, işler daha da ilginç hale gelir. Böyle bir durumda, daha yeni bir "Ziyaretçi kalıbı" fikri kullanılır. Buna "Nesne Düzeyinde Geri Al / Yinele" denir veya silinmiş değişkenlere veya değiştirilmiş değişkenlere bir bayrak verilir, böylece Geri Al / Yinele yalnızca bu belleği geri alır / yeniden yapar Bir nesnenin içinde kısmi bir Geri Al / Yinele yapmamız gerekirse, işler daha da ilginç hale gelir. Böyle bir durumda, daha yeni bir "Ziyaretçi kalıbı" fikri kullanılır. Buna "Nesne Düzeyinde Geri Al / Yinele" denir
- Nesne seviyesi Geri Al / Yinele: Geri alma / yineleme bildirimi çağrıldığında, her nesne bir akış işlemi gerçekleştirir, burada akış sağlayıcı nesneden programlanan eski verileri / yeni verileri alır. Rahatsız edilmeyen veriler bozulmadan bırakılır. Her nesne, argüman olarak bir yayınlayıcı alır ve UNDo / Redo çağrısının içinde, nesnenin verilerini akışa alır / akışını kaldırır.
Hem 1 hem de 2, 1. BeforeUndo () 2. AfterUndo () 3. BeforeRedo () 4. AfterRedo () gibi yöntemlere sahip olabilir. Bu yöntemlerin temel Geri Al / Yinele Komutunda (bağlamsal komutta değil) yayınlanması gerekir, böylece tüm nesneler belirli eylemleri elde etmek için bu yöntemleri uygular.
İyi bir strateji, 1 ve 2'nin bir melezini oluşturmaktır. Güzel olan, bu yöntemlerin (1 ve 2) kendilerinin komut kalıplarını kullanmasıdır.