Behavioral design patternlardan birisi olan memento patternin temel amacı ve çözüm sunduğu nokta bir nesnenin t anındaki statetini/durumunu tutarak, istenildiği zaman (t+n anında) geri t anındaki nesneye dönebilmemizi sağlar, özellikle programlama dillerinde sıklıkla karşılaşılan bir sorun olan geri alma (undo) işlemleri için kullanışlıdır.
Örneğin, bir metin editöründe kullanıcı bir takım değişiklikler yapar ve sonrasında geri alma işlemi yapmak istediğinde, Memento tasarım deseni kullanılabilir. Editör, her değişiklikten sonra bir Memento nesnesi oluşturarak değişikliğin yapıldığı zamanki durumu kaydeder. Kullanıcı geri alma işlemi yapmak istediğinde, en son kaydedilmiş Memento nesnesi geri yüklenir ve nesne yeniden önceki durumuna döner.
Pythonda Memento patternin uygulanması için iki temel sınıf tanımlanır, bunlar, Originator (orijinal, yaratıcı) ve Memento (hatıra, yadigar, bellek) sınıflarıdır. Originator sınıfı, nesnenin stateini temsil eder ve Memento sınıfı, nesnenin stateini tutacak olan sınıftır, Caretaker (bakıcı) sınıfı ise Memento nesnelerini yönetir ve geri alma işlemlerini gerçekleştirir.
Öncelikle Originator sınıfı oluşturulur. Bu sınıfın, durumu kaydetmek ve geri yüklemek için iki yöntemi vardır. İlk yöntem, nesnenin statetini Memento sınıfında kaydetmek ve ikinci yöntem, nesnenin stateini Memento nesnesinden geri yüklemektir.
Memento sınıfı, nesnenin statei için oluşturulur, Originator sınıfındaki durumun bir kopyasını saklar ve içinde, durumun geri yüklenmesi için bir yöntem vardır.
Caretaker sınıfı, Memento nesnelerini yönetmek için kullanılır. Genellikle Memento nesneleri bir listeye eklenir ve geri alma işlemi gerektiğinde bu listeden ilgili Memento nesnesini geri yükler.
class TextEditor:
def __init__(self):
self.content = ""
def add_text(self, text):
self.content += text
def delete_text(self, text):
self.content = self.content.replace(text, "")
def save(self):
return TextEditorMemento(self.content)
def restore(self, memento):
self.content = memento.get_saved_content()
class TextEditorMemento:
def __init__(self, content):
self.saved_content = content
def get_saved_content(self):
return self.saved_content
class TextEditorHistory:
def __init__(self):
self.mementos = []
def add_memento(self, memento):
self.mementos.append(memento)
def get_last_memento(self):
if self.mementos:
return self.mementos.pop()
else:
return None
if __name__ == '__main__':
text_editor = TextEditor()
text_editor.add_text("Hello ")
text_editor.add_text("World! ")
text_editor.add_text("From Python")
print(f"Current content: {text_editor.content}")
text_editor_history = TextEditorHistory()
text_editor_history.add_memento(text_editor.save())
text_editor.delete_text("World! ")
print(f"Content after deleting 'World!': {text_editor.content}")
text_editor_history.add_memento(text_editor.save())
last_memento = text_editor_history.get_last_memento()
text_editor.restore(last_memento)
print(f"Content after restoring last memento: {text_editor.content}")
last_memento = text_editor_history.get_last_memento()
text_editor.restore(last_memento)
print(f"Content after restoring last memento again: {text_editor.content}")
-----------------------------------------------------------------------
Output:
Current content: Hello World! From Python
Content after deleting 'World!': Hello From Python
Content after restoring last memento: Hello From Python
Content after restoring last memento again: Hello World! From Python
Sonuç olarak memento pattern nesnelerin statelerinin geçmişe dönük tutulması geri alınması gereken yapılarda efektif bir çözüm sunmaktadır, ancak diğer taraftan varolan hiyerarşiye yeni bir yapı eklediğinden karmaşıklığı artıracak ve nesnelerin statelerini tutmanın bir maliyeti olacağından bellek kullanımı konusunda dikkatli olmak gerekecektir.
Be First to Comment