Command pattern-i sorğunu əməliyyatı və onun parametrlərini saxlayan obyektə çevirir. Belə obyekti saxlamaq, ötürmək, növbəyə qoymaq, loqlamaq və özünü geri qaytarmağı bacarırsa, ləğv etmək olar. Bu, redaktorlarda undo/redo qurmağın standart yoludur.
History Document üzərində işləyən komandaları işlədirRollar
- Command
execute()(vəundo()) elan edir. - Qəbuledici (
Document) əsl işi görür. - Çağıran (
History, düymə) komandaları işlədir və onların nə etdiyini bilmir.
Undo olan komandalar
Insert və Delete sənədi və öz parametrlərini saxlayır. undo() execute()-un etdiyini dəqiq geri qaytarmalıdır, ona görə komanda lazım olanı icra anında saxlayır: Delete silinmiş mətni self.removed-də saxlayır.
class Document:
def __init__(self):
self.text = ""
class Insert:
def __init__(self, doc, s):
self.doc, self.s = doc, s
def execute(self):
self.doc.text += self.s
def undo(self):
n = len(self.doc.text) - len(self.s)
self.doc.text = self.doc.text[:n]
class Delete:
def __init__(self, doc, n):
self.doc, self.n, self.removed = doc, n, ""
def execute(self):
cut = max(len(self.doc.text) - self.n, 0)
self.removed = self.doc.text[cut:]
self.doc.text = self.doc.text[:cut]