Moim zdaniem UNDO / REDO można by wdrożyć szeroko na 2 sposoby. 1. Poziom polecenia (nazywany poziomem polecenia Cofnij / Ponów) 2. Poziom dokumentu (nazywany globalnym Cofnij / Ponów)
Poziom poleceń: jak wskazuje wiele odpowiedzi, można to skutecznie osiągnąć za pomocą wzorca Memento. Jeśli polecenie obsługuje również kronikowanie akcji, łatwo jest wykonać ponowienie.
Ograniczenie: Po wygaśnięciu zakresu polecenia cofnięcie / ponowienie jest niemożliwe, co prowadzi do poziomu dokumentu (globalnego) cofnij / ponów
Myślę, że Twój przypadek pasowałby do globalnego cofania / ponawiania, ponieważ jest odpowiedni dla modelu, który wymaga dużo miejsca w pamięci. Jest to również odpowiednie do selektywnego cofania / ponawiania. Istnieją dwa typy pierwotne
- Cofnij / ponów całą pamięć
- Poziom obiektu Cofnij Ponów
W „Cofnij / Ponów całą pamięć” cała pamięć jest traktowana jako połączone dane (takie jak drzewo, lista lub wykres), a pamięcią zarządza aplikacja, a nie system operacyjny. Tak więc operatory new i delete, jeśli w C ++ są przeciążone, aby zawierały bardziej szczegółowe struktury, aby skutecznie implementować operacje, takie jak. Jeśli jakikolwiek węzeł zostanie zmodyfikowany, b. przechowywanie i kasowanie danych itp., Funkcjonuje w zasadzie kopiowanie całej pamięci (zakładając, że alokacja pamięci jest już zoptymalizowana i zarządzana przez aplikację przy użyciu zaawansowanych algorytmów) i przechowywanie jej w stosie. Jeśli zażądano kopii pamięci, struktura drzewa jest kopiowana w oparciu o potrzebę posiadania płytkiej lub głębokiej kopii. Głęboka kopia jest tworzona tylko dla tej zmiennej, która jest modyfikowana. Ponieważ każda zmienna jest przydzielana za pomocą przydziału niestandardowego, aplikacja ma ostatnie słowo, kiedy należy ją usunąć w razie potrzeby. Sprawy stają się bardzo interesujące, jeśli musimy podzielić Cofnij / Ponów na partycje, gdy tak się stanie, że musimy programowo-selektywnie Cofnij / Ponów zestaw operacji. W tym przypadku tylko te nowe zmienne lub usunięte zmienne lub zmodyfikowane zmienne otrzymują flagę, dzięki czemu Cofnij / Ponów tylko cofa / przywraca pamięć Rzeczy stają się jeszcze bardziej interesujące, jeśli musimy wykonać częściowe Cofnij / Ponów wewnątrz obiektu. W takim przypadku używana jest nowsza koncepcja „wzorca gości”. Nazywa się to „Cofnij / ponów na poziomie obiektu” lub usunięte zmienne lub zmodyfikowane zmienne otrzymują flagę, dzięki czemu Cofnij / Ponów tylko cofa / przywraca tę pamięć Sprawy stają się jeszcze bardziej interesujące, jeśli musimy wykonać częściowe Cofnij / Ponów wewnątrz obiektu. W takim przypadku używana jest nowsza koncepcja „wzorca gości”. Nazywa się to „Cofnij / ponów na poziomie obiektu” lub usunięte zmienne lub zmodyfikowane zmienne otrzymują flagę, dzięki czemu Cofnij / Ponów tylko cofa / przywraca pamięć Rzeczy stają się jeszcze bardziej interesujące, jeśli musimy wykonać częściowe Cofnij / Ponów wewnątrz obiektu. W takim przypadku używana jest nowsza koncepcja „wzorca gości”. Nazywa się to „Cofnij / ponów na poziomie obiektu”
- Cofnij / ponów na poziomie obiektu: gdy wywoływane jest powiadomienie o cofnięciu / ponownym wykonaniu, każdy obiekt implementuje operację przesyłania strumieniowego, w której urządzenie do przekazu strumieniowego pobiera z obiektu stare / nowe dane, które są zaprogramowane. Dane, które nie zostaną naruszone, pozostają nienaruszone. Każdy obiekt otrzymuje streamer jako argument i wewnątrz wywołania UNDo / Redo przesyła strumieniowo / usuwa strumieniowo dane obiektu.
Zarówno 1, jak i 2 mogą mieć takie metody, jak 1. BeforeUndo () 2. AfterUndo () 3. BeforeRedo () 4. AfterRedo (). Metody te muszą być opublikowane w podstawowym poleceniu Cofnij / Ponów (nie w poleceniu kontekstowym), aby wszystkie obiekty również implementowały te metody w celu uzyskania określonej akcji.
Dobrą strategią jest stworzenie hybrydy 1 i 2. Piękno polega na tym, że te metody (1 i 2) same używają wzorców poleceń