python设计模式18-备忘录模式

1. 备忘录模式(Memento)介绍

UML类图

在这里插入图片描述

角色介绍

  • 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
  • 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
  • 管理角色:对备忘录进行管理,保存和提供备忘录。

用途

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态

2. 示例

  • 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回。这时我们便可以使用备忘录模式来实现。
  • 代码演示了一个单状态单备份的例子,逻辑非常简单:Originator类中的state变量需要备份,以便在需要的时候恢复;Memento类中,也有一个state变量,用来存储Originator类中state变量的临时状态;而Caretaker类就是用来管理备忘录类的,用来向备忘录对象中写入状态或者取回状态。
"""Memento Pattern with Python Code
"""

class Memento(object):
    def __init__(self, state):
        self.state = state
    
    def getState(self):
        return self.state
    
    def setState(self, state):
        self.state = state


class Originator(object):
    def getState(self):
        return self.state
    
    def setState(self, state):
        self.state = state
    
    def createMemento(self):
        return Memento(self.state)
    
    def restoreMemento(self, memento:Memento):
        self.setState(memento.getState())
    

class Caretaker(object):
    def getMemento(self):
        return self.memento
    
    def setMemento(self, memento:Memento):
        self.memento = memento
    

class Client(object):
    def main(self):
        originator = Originator()
        originator.setState("状态1");
        print("初始状态:" + originator.getState())
        caretaker = Caretaker()
        caretaker.setMemento(originator.createMemento())
        originator.setState("状态2")
        print("改变后状态:" + originator.getState())
        originator.restoreMemento(caretaker.getMemento())
        print("恢复后状态:" + originator.getState())


if __name__ == "__main__":
    Client().main()   

输出:

# ./Memento.py
初始状态:状态1
改变后状态:状态2
恢复后状态:状态1

参考:
https://wiki.jikexueyuan.com/project/java-design-pattern/memento-pattern.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章