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ədir
History Document üzərində işləyən komandaları işlədir

Rollar

  • 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.

python
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]