Theo tôi, UNDO / REDO có thể được thực hiện rộng rãi theo 2 cách. 1. Mức lệnh (được gọi là mức lệnh Hoàn tác / Làm lại) 2. Mức độ tài liệu (được gọi là Hoàn tác / Làm lại toàn cầu)
Mức độ lệnh: Như nhiều câu trả lời đã chỉ ra, điều này đạt được hiệu quả bằng cách sử dụng Memento pattern. Nếu lệnh cũng hỗ trợ ghi nhật ký hành động, thì việc thực hiện lại dễ dàng được hỗ trợ.
Giới hạn: Khi hết phạm vi của lệnh, không thể hoàn tác / làm lại, dẫn đến hoàn tác / làm lại cấp tài liệu (toàn cầu)
Tôi đoán trường hợp của bạn sẽ phù hợp với hoàn tác / làm lại toàn cầu vì nó phù hợp với một mô hình có nhiều không gian bộ nhớ. Ngoài ra, điều này cũng phù hợp để hoàn tác / làm lại có chọn lọc. Có hai loại nguyên thủy
- Hoàn tác / làm lại tất cả bộ nhớ
- Mức đối tượng Hoàn tác làm lại
Trong "Hoàn tác / Làm lại tất cả bộ nhớ", toàn bộ bộ nhớ được coi là dữ liệu được kết nối (chẳng hạn như cây, hoặc danh sách hoặc biểu đồ) và bộ nhớ được quản lý bởi ứng dụng chứ không phải Hệ điều hành. Vì vậy các toán tử new và delete nếu trong C ++ được nạp chồng để chứa các cấu trúc cụ thể hơn nhằm thực hiện hiệu quả các phép toán như a. Nếu bất kỳ nút nào được sửa đổi, b. giữ và xóa dữ liệu, v.v., Cách thức hoạt động của nó về cơ bản là sao chép toàn bộ bộ nhớ (giả sử rằng việc cấp phát bộ nhớ đã được ứng dụng tối ưu hóa và quản lý bằng các thuật toán nâng cao) và lưu trữ nó trong một ngăn xếp. Nếu bản sao của bộ nhớ được yêu cầu, cấu trúc cây sẽ được sao chép dựa trên nhu cầu có bản sao nông hay sâu. Bản sao sâu chỉ được tạo cho biến đó đã được sửa đổi. Vì mọi biến được phân bổ bằng cách sử dụng phân bổ tùy chỉnh, ứng dụng có tiếng nói cuối cùng để xóa nó nếu cần. Mọi thứ trở nên rất thú vị nếu chúng ta phải phân vùng Hoàn tác / Làm lại khi nó xảy ra đến mức chúng ta cần phải Lập trình chọn lọc Hoàn tác / Làm lại một tập hợp hoạt động. Trong trường hợp này, chỉ các biến mới đó, hoặc các biến đã xóa hoặc các biến đã sửa đổi mới được gắn cờ để Undo / Redo chỉ hoàn tác / làm lại bộ nhớ đó Mọi thứ thậm chí còn thú vị hơn nếu chúng ta cần thực hiện Undo / Redo một phần bên trong một đối tượng. Khi trường hợp này xảy ra, một ý tưởng mới hơn về "Mẫu khách truy cập" được sử dụng. Nó được gọi là "Hoàn tác / làm lại cấp độ đối tượng" hoặc các biến đã xóa hoặc các biến đã sửa đổi được gắn cờ để Undo / Redo chỉ hoàn tác / làm lại những bộ nhớ đó Mọi thứ thậm chí còn thú vị hơn nếu chúng ta cần thực hiện Undo / Redo một phần bên trong một đối tượng. Khi trường hợp này xảy ra, một ý tưởng mới hơn về "Mẫu khách truy cập" được sử dụng. Nó được gọi là "Hoàn tác / làm lại cấp độ đối tượng" hoặc các biến đã xóa hoặc các biến đã sửa đổi được gắn cờ để Undo / Redo chỉ hoàn tác / làm lại những bộ nhớ đó Mọi thứ thậm chí còn thú vị hơn nếu chúng ta cần thực hiện Undo / Redo một phần bên trong một đối tượng. Khi trường hợp này xảy ra, một ý tưởng mới hơn về "Mẫu khách truy cập" được sử dụng. Nó được gọi là "Hoàn tác / làm lại cấp độ đối tượng"
- Mức đối tượng Hoàn tác / Làm lại: Khi thông báo để hoàn tác / làm lại được gọi, mọi đối tượng thực hiện thao tác phát trực tuyến trong đó, trình phát trực tiếp nhận từ đối tượng dữ liệu cũ / dữ liệu mới được lập trình. Dữ liệu không bị xáo trộn sẽ không bị xáo trộn. Mọi đối tượng đều lấy một luồng làm đối số và bên trong lệnh gọi UNDo / Redo, nó truyền / hủy luồng dữ liệu của đối tượng.
Cả 1 và 2 đều có thể có các phương thức như 1. BeforeUndo () 2. AfterUndo () 3. BeforeRedo () 4. AfterRedo (). Các phương thức này phải được xuất bản trong Lệnh hoàn tác / làm lại cơ bản (không phải lệnh theo ngữ cảnh) để tất cả các đối tượng cũng thực hiện các phương thức này để có được hành động cụ thể.
Một chiến lược tốt là tạo ra sự kết hợp giữa 1 và 2. Cái hay là bản thân các phương pháp này (1 & 2) sử dụng các mẫu lệnh