Python备忘录模式

备忘录模式,类似于撤销功能,提供保存并恢复之前状态的功能。

class Momento(object):
    def __init__(self):
        super().__init__()
        self.dct = {}

    def set_status(self, dct):
        self.dct = {}
        for key in dct:
            if not key.startswith('_'):
                self.dct[key] = dct[key]

    def get_status(self):
        return self.dct


class Obj(object):
    def __init__(self, a):
        super().__init__()
        self.attribute_a = a

        self._momento = Momento()

    def set_a(self, status):
        self.backup_current_status()
        self.attribute_a = status

    def restore_previous_status(self):
        self.__dict__.update(self._momento.get_status())

    def backup_current_status(self):
        self._momento.set_status(self.__dict__)

    def __str__(self):
        return "attribute_a: " + self.attribute_a + '\n'


def main():
    obj = Obj('a')
    obj.set_a('aa')
    print('current_status:\n', obj)
    obj.restore_previous_status()
    print('previous_status:\n', obj)


if __name__ == '__main__':
    main()
### Python备忘录模式 (Memento Pattern) 的实现 备忘录模式是一种行为设计模式,它能够在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并允许稍后恢复该状态[^3]。 以下是基于 Python 实现的一个简单例子: #### 备忘录类定义 ```python class Memento: def __init__(self, state): self._state = state def get_saved_state(self): return self._state ``` 此 `Memento` 类用于存储发起人的状态。通过构造函数传入当前状态 `_state` 并提供方法获取已保存的状态。 #### 发起人类定义 ```python class Originator: def __init__(self): self._state = None def set_state(self, state): print(f"Originator: Setting state to {state}") self._state = state def save_to_memento(self): print("Originator: Saving to Memento.") return Memento(self._state) def restore_from_memento(self, memento): self._state = memento.get_saved_state() print(f"Originator: State restored from Memento to {self._state}") ``` 在此部分中,`Originator` 是负责创建和管理备忘录的对象。它可以设置自己的状态并通过调用 `save_to_memento()` 方法将其保存至备忘录实例;同样可以通过 `restore_from_memento(memento)` 来从备忘录恢复之前的状态。 #### 管理者类定义 ```python class Caretaker: def __init__(self): self._mementos = [] def add_memento(self, memento): self._mementos.append(memento) print("Caretaker: Added a new memento.") def undo(self): if not self._mementos: return None last_memento = self._mementos.pop() print("Caretaker: Undoing the previous action.") return last_memento ``` 管理者 (`Caretaker`) 负责维护多个备忘录的历史记录列表。当需要回退操作时,可以从历史记录栈顶弹出最后一个备忘录来执行撤销动作。 #### 使用示例 ```python if __name__ == "__main__": originator = Originator() caretaker = Caretaker() originator.set_state("State1") caretaker.add_memento(originator.save_to_memento()) originator.set_state("State2") caretaker.add_memento(originator.save_to_memento()) originator.set_state("State3") # Restoring states using undo operations. memento = caretaker.undo() originator.restore_from_memento(memento) memento = caretaker.undo() originator.restore_from_memento(memento) ``` 运行以上代码会依次展示如何改变状态、保存这些变化以及最后怎样一步步撤回到之前的某个特定时刻。 --- #### 关键点总结 - **封装性保护**: 对象的状态被安全地存放在独立的 `Memento` 对象里,外部无法直接访问。 - **责任分离原则**: 不同角色各司其职——`Originator` 创建与还原状态,而 `Caretaker` 则只关心管理和追踪那些已经存在的备忘录们。 - **灵活性增强**: 可轻松扩展支持更多复杂的业务逻辑或者持久化机制等附加功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值