2009-03-31 31 views

Trả lời

92

Nó không phải là cấu trúc dữ liệu mà là một mẫu thiết kế. Bạn đang tìm kiếm Command Pattern.

Tiêu chuẩn là giữ các đối tượng Command trong ngăn xếp để hỗ trợ hoàn tác đa cấp. Để hỗ trợ làm lại, một ngăn xếp thứ hai giữ tất cả các lệnh bạn đã hoàn tác. Vì vậy, khi bạn bật ngăn xếp hoàn tác để hoàn tác một lệnh, bạn nhấn lệnh tương tự bạn đã bật vào ngăn xếp làm lại. Bạn làm điều tương tự ngược lại khi bạn làm lại một lệnh. Bạn bật ngăn xếp làm lại và đẩy lệnh xuất hiện trở lại ngăn xếp hoàn tác.

+28

Ngoài ra, điều quan trọng là luôn xóa ngăn xếp Làm lại nếu bạn đẩy một lệnh khác. – Balk

+10

Cấu trúc dữ liệu là Ngăn xếp với các đối tượng của các đối tượng "Lệnh". – zinovii

+1

Tôi cảm thấy như mô hình lệnh không nhất thiết là cách bạn thực hiện hoàn tác, nó chỉ là một lựa chọn, cũng không phải là câu trả lời cho câu hỏi của OP. Các ngăn xếp undo/redo là câu trả lời. (Mặc dù tôi cho rằng anh ta đã đề cập đến MSWord.) –

31

Trên thực tế, mô hình tiêu chuẩn cho chức năng này (Gang of Four, thậm chí) là Memento.

Ngoài ra, trong khi hầu hết các chương trình sử dụng Undo/Redo ngăn xếp, afficionados của soạn thảo văn bản nào đó thích Undo/Redo cây để họ không bị mất toàn bộ lịch sử của họ nếu họ lùi lại một vài lệnh, hãy thử một hình mới, và thay đổi suy nghĩ của họ.

+3

Bạn nói đúng. Nếu bạn thêm thông tin thêm về cách nó tương tác với mẫu lệnh, đây sẽ là một câu trả lời tuyệt vời. – Kieveli

+0

Cố gắng xóa sử dụng Memento, Memento có được sử dụng để lưu trữ trạng thái của các đối tượng trước và sau khi thao tác để hoàn tác/làm lại không? – NileshChauhan

+1

Đối tượng tạo Memento sử dụng nó để trả về chính trạng thái đó. Memento chính nó nên được coi như là nó mờ đục. Nhét toàn bộ tiểu bang vào Memento có vẻ như là một lựa chọn thực hiện rõ ràng, nhưng nó có thể dễ dàng là một sự khác biệt, hoặc một id vào một cửa hàng sao lưu, hoặc cái gì khác. –

0

Đây là trường hợp cổ điển của Mẫu lệnh. Sau đây là triển khai mẫu tính năng hoàn tác bằng Python:

from os import rename 
class RenameFileCommand(object): 
    def __init__(self, src_file, target_file): 
     self.src_file=src_file 
     self.target_file=target_file 


    def execute(self): 
     rename(self.src_file, self.target_file) 

    def undo(self): 
     rename(self.target_file,self.src_file) 



class History(object): 
    def __init__(self): 
     self.commands=list() 
    def execute(self, command): 
     command.execute() 
     self.commands.append(command) 

    def undo(self): 
     self.commands.pop().undo() 


if __name__=='__main__': 
    hist=History() 
    hist.execute(RenameFileCommand('test1.txt', 'tmp.txt',)) 
    hist.undo() 
    hist.execute(RenameFileCommand('tmp2.txt', 'test2.txt',)) 
Các vấn đề liên quan