...

Python设计模式-19-备忘录模式

备忘录模式是一种行为型设计模式,它允许我们在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式通常包括以下几个角色:

  • 发起人(Originator):定义了一个接口,用于创建备忘录对象和恢复对象状态。

  • 备忘录(Memento):存储发起人对象的内部状态。

  • 管理者(Caretaker):负责保存备忘录对象,并在需要时将其恢复到发起人对象中。

下面是一个简单的 Python 示例,演示了如何使用备忘录模式:

class Memento:
    def __init__(self, state):
        self.state = state

    def get_state(self):
        return self.state

class Originator:
    def __init__(self, state):
        self.state = state

    def create_memento(self):
        return Memento(self.state)

    def restore_memento(self, memento):
        self.state = memento.get_state()

    def get_state(self):
        return self.state

    def set_state(self, state):
        self.state = state

class Caretaker:
    def __init__(self):
        self.mementos = []

    def add_memento(self, memento):
        self.mementos.append(memento)

    def get_memento(self, index):
        return self.mementos[index]

originator = Originator('State 1')
print(f'Originator state: {originator.get_state()}')

caretaker = Caretaker()
caretaker.add_memento(originator.create_memento())

originator.set_state('State 2')
print(f'Originator state: {originator.get_state()}')

caretaker.add_memento(originator.create_memento())

originator.set_state('State 3')
print(f'Originator state: {originator.get_state()}')

memento = caretaker.get_memento(0)
originator.restore_memento(memento)
print(f'Originator state: {originator.get_state()}')

memento = caretaker.get_memento(1)
originator.restore_memento(memento)
print(f'Originator state: {originator.get_state()}')

在上面的示例中,我们定义了一个备忘录 Memento,它存储发起人对象的内部状态。然后,我们定义了一个发起人 Originator,它定义了一个接口 create_memento()restore_memento(),用于创建备忘录对象和恢复对象状态。接下来,我们定义了一个管理者 Caretaker,它负责保存备忘录对象,并在需要时将其恢复到发起人对象中。

在使用备忘录模式时,我们可以通过创建备忘录对象来保存发起人对象的内部状态,并在需要时将其恢复到发起人对象中。在上面的示例中,我们创建了一个发起人对象 originator,并将其状态分别设置为 State 1State 2State 3。然后,我们创建了一个管理者对象 caretaker,并将发起人对象的备忘录对象保存到其中。最后,我们从管理者对象中获取备忘录对象,并将其恢复到发起人对象中,从而实现了状态的恢复。需要注意的是,备忘录模式可以帮助我们在不破坏封装性的前提下,保存和恢复对象的内部状态,从而提高代码的可维护性和可扩展性。备忘录模式还可以用于实现撤销和重做功能,因为它允许我们保存对象的历史状态,并在需要时将其恢复到先前的状态。

posted @ 2023-06-16 18:43  韩志超  阅读(124)  评论(0编辑  收藏  举报