【python设计模式】19、备忘录模式

哲学思想:

备忘录模式是一种行为设计模式,它允许在不暴露对象实现细节的情况下,保存和恢复对象的内部状态。该模式的核心思想是将对象的状态保存到一个备忘录对象中,然后在需要时将状态恢复回来。

从哲学角度来看,备忘录模式与人类记忆和历史记录有着相似之处。人们可以通过记忆来保存自己的经历和状态,并在需要时恢复它们。历史记录则是保存了人类社会的经历和状态,帮助人们了解过去,预测未来,并在需要时从历史中汲取经验和教训。

在软件设计中,备忘录模式可以帮助我们实现对象的状态保存和恢复功能,从而更好地管理对象的状态。例如,在一个游戏中,我们可以使用备忘录模式来保存玩家的状态,以便在需要时恢复它们,或者在玩家离线时自动保存状态。在一个文本编辑器中,我们可以使用备忘录模式来保存文本的历史记录,以便在需要时撤销和重做操作。

总之,备忘录模式的哲学思想是,保存和恢复对象状态的能力对于软件设计来说非常重要,它可以帮助我们更好地管理对象的状态,并提高软件的可维护性和可靠性。

简介:

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获对象的内部状态并在对象之外保存该状态,以便在需要时恢复对象的状态。该模式的核心思想是将对象状态保存到一个备忘录对象中,然后在需要时将状态恢复回来。

备忘录模式包含三个主要角色:

  • Originator(发起人):负责创建一个备忘录对象,并将其状态保存到备忘录对象中。
  • Memento(备忘录):用于保存 Originator 对象的状态。
  • Caretaker(负责人):负责存储备忘录对象,并在需要时将其返回给 Originator 对象。

备忘录模式可以帮助我们实现对象的状态保存和恢复功能,从而更好地管理对象的状态。例如,在一个游戏中,我们可以使用备忘录模式来保存玩家的状态,以便在需要时恢复它们,或者在玩家离线时自动保存状态。在一个文本编辑器中,我们可以使用备忘录模式来保存文本的历史记录,以便在需要时撤销和重做操作。

优点:

  1. 使得对象状态的保存和恢复更加灵活:备忘录模式将对象状态的保存和恢复分离出来,使得这些功能更加灵活和可扩展。如果需要支持更多的状态保存和恢复操作,只需要添加相应的备忘录对象即可。

  2. 不破坏对象封装性:备忘录模式通过将状态保存到备忘录对象中,使得对象的状态不会被其他对象直接访问,从而保护了对象的封装性。

  3. 简化了备份操作:备忘录模式使得对象的备份操作更加简单,只需要创建一个备忘录对象并将其保存即可,而不需要修改原有的对象结构或代码。

  4. 支持撤销和重做操作:备忘录模式可以支持撤销和重做操作,使得用户可以回退到之前的状态或者重新执行之前的操作。

  5. 可以在不同的上下文中使用:备忘录模式可以在不同的上下文中使用,比如在游戏中保存玩家状态,在文本编辑器中保存文本历史记录等等。

缺点:

  1. 备忘录对象的存储会消耗大量的内存空间:如果需要保存的状态非常多,备忘录对象的存储会消耗大量的内存空间,从而影响程序的性能。

  2. 备忘录对象的访问权限问题:如果备忘录对象被其他对象访问,可能会导致状态泄露的问题,从而破坏对象的封装性。

  3. 备忘录模式的实现比较复杂:备忘录模式的实现比较复杂,需要定义多个类和接口,并且需要注意对象状态的一致性和正确性。

实际应用场景:

  1. 游戏状态的保存和恢复:在游戏中,玩家可能需要保存游戏状态并在之后恢复,备忘录模式可以很好地实现这个功能。

  2. 文本编辑器的撤销和重做操作:在文本编辑器中,用户可能需要撤销和重做一些操作,备忘录模式可以帮助实现这个功能。

  3. 数据库事务的回滚和恢复:在数据库中,事务的回滚和恢复可以使用备忘录模式来实现。

  4. 浏览器的前进和后退功能:在浏览器中,用户可以通过前进和后退按钮来切换页面,备忘录模式可以帮助实现这个功能。

  5. 订单状态的保存和恢复:在电商网站中,订单状态的保存和恢复可以使用备忘录模式来实现。

python代码实现:

# 备忘录类,用于保存对象状态
class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state


# 发起人类,即需要保存状态的对象
class Originator:
    def __init__(self):
        self._state = ""

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

    def get_state(self):
        return self._state

    # 创建备忘录对象
    def create_memento(self):
        return Memento(self._state)

    # 恢复对象状态
    def restore_memento(self, memento):
        self._state = memento.get_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]


# 测试代码
if __name__ == '__main__':
    # 创建发起人对象
    originator = Originator()

    # 创建管理者对象
    caretaker = Caretaker()

    # 修改发起人对象状态并保存备忘录对象
    originator.set_state("State 1")
    memento1 = originator.create_memento()
    caretaker.add_memento(memento1)

    # 修改发起人对象状态并保存备忘录对象
    originator.set_state("State 2")
    memento2 = originator.create_memento()
    caretaker.add_memento(memento2)

    # 恢复发起人对象状态
    originator.restore_memento(caretaker.get_memento(0))
    print(originator.get_state())

    originator.restore_memento(caretaker.get_memento(1))
    print(originator.get_state())

在上面的代码中,我们定义了三个类:备忘录类 Memento,发起人类 Originator 和管理者类 Caretaker。其中,备忘录类用于保存对象状态,发起人类用于创建备忘录对象和恢复对象状态,管理者类用于管理备忘录对象。

在测试代码中,我们首先创建了发起人对象 originator 和管理者对象 caretaker,然后修改发起人对象的状态并保存备忘录对象,最后恢复对象状态并输出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值