2009-01-12 32 views
8

Tôi đang cố triển khai tính năng hoàn tác/làm lại trong ứng dụng của mình, sử dụng Command Pattern. Tôi đang đối mặt với một vấn đề.hoàn tác/làm lại với xóa tầng

Để minh họa, hãy tưởng tượng bạn có thể tạo với hồ sơ 2D ứng dụng của tôi (bao nhiêu tùy thích).

Từ các cấu hình 2D này, bạn có thể tạo phần 3D với các thuộc tính khác nhau (tên, màu, tỷ lệ, v.v ...).

+--------------+    +--------------+  +--------------+ 
| 2D profile A |    | 2D profile B |  | 2D profile C | 
+--------------+    +--------------+  +--------------+ 
    | |       | 
    | +---------------+  +---------------+ 
    | | 3D Part B  |  | 3D Part C  | 
    | | Colour : blue |  | Colour : grey | 
    | | Name : bibi |  | Name : foo | 
    | | Scale : 33% |  | Scale : 100% | 
    | +---------------+  +---------------+ 
+--------------+ 
| 3D Part A | 
| Colour : red | 
| Name : aaa | 
| Scale : 50% | 
+--------------* 

Khi một hồ sơ bị xóa, tất cả các phần 3D tích hợp sẵn trong hồ sơ này được automaticaly xóa quá (khi một hồ sơ sắp bị xóa, một người quản lý phần 3D được thông báo và sẽ xóa những phần 3D trở nên lỗi thời. Các khung nhìn cũng được thông báo để cập nhật GUI).

Đây là nơi tôi đang phải đối mặt với một vấn đề: Tôi đang viết các undo/redo lệnh cho việc xoá cấu hình 2D, mà trông giống như sau (pseudo-code):

virtual void redo() 
{ 
    m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile 
} 

virtual void undo() 
{ 
    m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost 
} 

Như bạn có thể xem trong đoạn mã trên, việc xóa hồ sơ 2D sẽ tự động xóa tất cả các phần 3D dựa vào hồ sơ đã xóa.

Nhưng khi hoàn tác, việc thêm lại cấu hình 2D vào danh sách là không đủ: các phần 3D bị mất.

Tôi nên làm gì? Liệu lệnh hoàn tác/làm lại có chịu trách nhiệm quản lý việc xóa các phần 3D (điều gì đó thực sự được thực hiện bởi người quản lý phần 3d)? Điều này có nghĩa là lệnh undo/redo cũng có trách nhiệm thông báo cho các khung nhìn để cập nhật GUI.

Hoặc lệnh hoàn tác/làm lại sẽ tạo bản sao nội bộ của tất cả các phần 3D sẽ bị xóa và để người quản lý phần 3D xóa các phần 3D?

Hoặc có giải pháp nào tốt hơn không?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

1

Bạn muốn có một biến thể nhỏ về điều này: Memento pattern. Bạn lưu trữ ảnh chụp nhanh của cây đối tượng hoàn chỉnh của bạn hoặc chỉ tất cả các khác biệt ở mỗi thay đổi. Được trang bị lịch sử thay đổi liên tiếp này, bạn có thể quay lại và chuyển tiếp qua các lệnh đến nội dung trái tim của bạn, mà không làm mất các đối tượng phụ thuộc.

Các vấn đề liên quan