首页 > 其他分享 >设计模式之备忘录模式

设计模式之备忘录模式

时间:2024-09-29 21:25:46浏览次数:8  
标签:originator 状态 模式 备忘录 state 发起人 设计模式 Memento

备忘录模式

备忘录模式是一种行为设计模式,它允许保存和恢复对象的内部状态,而无需暴露该对象的实现细节。这种模式在实现撤销操作或是需要保存和恢复数据的场景中非常有用。

核心组件

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

  1. 发起人(Originator):负责创建一个含有其当前内部状态的备忘录,并可以使用备忘录来恢复其内部状态。
  2. 备忘录(Memento):负责存储发起人的内部状态,并防止发起人以外的对象访问备忘录。备忘录有两个接口,管理者只能看到一个窄接口,它只允许将备忘录传给其他对象。发起人则能看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
  3. 管理者(Caretaker):负责保存备忘录,但不修改备忘录,也不直接操作备忘录的内容。管理者通过保存备忘录可以记录发起人对象的状态,用于未来的恢复。

工作原理

  • 发起人创建一个备忘录对象,将其当前内部状态作为备忘录的内容保存起来。
  • 管理者请求发起人创建一个新的备忘录,并将其保存在备忘录列表中。管理者可以按需存储或删除备忘录。
  • 当需要恢复到某个历史状态时,管理者从备忘录列表中取出对应的备忘录,并将其交给发起人。发起人使用备忘录中的状态进行自身状态的恢复。

设计意图

备忘录模式的设计意图是允许在不违反封装的情况下,捕获并外部化对象的内部状态,以便以后可以将该对象恢复到定义的状态。备忘录模式提供了一种机制,记录对象的当前状态,并在需要时将对象恢复到这个状态。

优点

  1. 封装性好:备忘录模式提供了一种封装状态的机制,使得客户不需要关心状态的保存细节。
  2. 简化发起人:发起人不需要管理和保存其内部状态的历史记录,所有状态管理的责任都由管理者承担,这简化了发起人的职责。

缺点

  1. 资源消耗:如果发起人的状态需要大量资源来存储,频繁地创建备忘录可能会消耗大量资源。
  2. 难以维护:随着发起人状态的增多,管理者的工作量和存储需求也会增大。

代码实践

下面是一个使用 Go 语言实现的备忘录模式的例子。我们将创建一个简单的计算器程序,该程序能够保存历史计算结果,并能够回退到之前的状态。

首先,我们定义备忘录结构体 Memento,用于保存状态:

package main

import "fmt"

// Memento struct
type Memento struct {
	state int
}

func (m *Memento) GetSavedState() int {
	return m.state
}

接着,我们定义发起人结构体 Originator,它将使用 Memento 来保存和恢复状态:

// Originator struct
type Originator struct {
	state int
}

func (o *Originator) SetState(state int) {
	o.state = state
}

func (o *Originator) SaveStateToMemento() *Memento {
	return &Memento{state: o.state}
}

func (o *Originator) GetStateFromMemento(memento *Memento) {
	o.state = memento.GetSavedState()
}

func (o *Originator) GetState() int {
	return o.state
}

然后,定义管理者 Caretaker,它负责保存和获取备忘录对象:

// Caretaker struct
type Caretaker struct {
	mementoList []*Memento
}

func (c *Caretaker) Add(memento *Memento) {
	c.mementoList = append(c.mementoList, memento)
}

func (c *Caretaker) Get(index int) *Memento {
	return c.mementoList[index]
}

最后,我们可以在 main 函数中使用这些结构体来模拟保存和恢复状态的操作:

func main() {
	originator := &Originator{}
	caretaker := &Caretaker{}

	originator.SetState(100)
	caretaker.Add(originator.SaveStateToMemento())

	originator.SetState(200)
	caretaker.Add(originator.SaveStateToMemento())

	originator.SetState(300)
	fmt.Printf("Current State: %d\n", originator.GetState())

	// Restoring to the first saved state
	originator.GetStateFromMemento(caretaker.Get(0))
	fmt.Printf("First saved State: %d\n", originator.GetState())

	// Restoring to the second saved state
	originator.GetStateFromMemento(caretaker.Get(1))
	fmt.Printf("Second saved State: %d\n", originator.GetState())
}

在这个例子中,Originator 类用于表示一个简单的状态(这里是一个整数)。我们可以设置这个状态,保存到备忘录,或者从备忘录中恢复。Caretaker 管理这些备忘录,允许我们保存多个状态并在需要时恢复它们。在 main 函数中,我们演示了如何保存状态并在之后恢复到这些状态。

总结

总之,备忘录模式提供了一种有效的方式来处理对象状态的保存和恢复,但需要权衡其对资源的消耗和实际应用场景的需求。

标签:originator,状态,模式,备忘录,state,发起人,设计模式,Memento
From: https://www.cnblogs.com/zhifwu/p/18440766

相关文章

  • RAID工作模式
    RAID维基百科,自由的百科全书独立磁盘冗余数组(RAID, Redundant Arrayof Independent Disks),旧称廉价磁盘冗余数组(RAID, Redundant Arrayof InexpensiveDisks),简称硬盘阵列。其基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格......
  • 责任链模式:如何解决审核、过滤场景问题?
    相较而言,责任链模式是一个使用频率很高的模式,大家在日常的开发过程中,也可能会经常遇到,下面,我们就一起来了解一下责任链模式的内容。一、模式原理分析责任链模式的原始定义是:通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿着链传递请求,直到......
  • IN612L 超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编
    IN612L超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编程工具支持。主要特性•多模协同通信协议栈低功耗蓝牙5.0完全符合低功耗蓝牙5规格高数据速率支持最高2Mbps远距离支持(125Kbps/500Kbps)。扩展广播模式支持SDR(软件定义无线电,用户......
  • Python 设计模式之工厂模式:灵活构建对象的利器
    在软件开发中,设计模式是解决常见问题的通用方案,能够提高代码的可维护性、可扩展性和可读性。其中,工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离,使得代码更加灵活和可维护。在Python中,工厂模式同样有着广泛的应用。本文将深入探讨Python......
  • Python 单例模式:确保类的实例唯一
    在Python编程中,设计模式是解决特定问题的可复用的解决方案。单例模式是一种创建型设计模式,它在许多场景下都有着重要的应用。本文将深入探讨Python中的单例模式,包括其定义、实现方式、应用场景以及需要注意的要点等。一、单例模式的定义单例模式是一种设计模式,它确保......
  • .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
    .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) 思维导航前言三层架构MVC架构DDD分层架构整洁架构CQRS架构最后总结参考文章DotNetGuide技术社区前言项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以......
  • [原]行为树模式(BT)和有限状态机模式(FSM)
    概述有限状态机(FiniteStateMachine,FSM)和行为树(BehaviorTree,BT)都是用于游戏开发、机器人学以及其他需要实现复杂行为逻辑的领域中常用的设计模式。它们各自有独特的优点和缺点,适用于不同的场景。有限状态机模式(FSM)定义:有限状态机是一种数学模型,用来表示一个系统可以......
  • Reactor模式
    Reactor模式许多高性能的服务器软件离不开Reactor模式.像高性能缓存Redis,高性能web服务器Nginx,高性能的网络组件Netty,高性能的消息中间件Kafka,RocketMQ等.那什么是Reactor模式呢?借用DougLea大师的话来说,就是:Reactor模式由Reactor线程,Handles处理器两大角色组成,它们的......
  • 设计模式之模板方法模式
    模板方法模式模板方法模式是一种行为型设计模式,它定义了一个操作中的算法的框架,并将一些步骤的执行延迟到子类中。通过这种方式,模板方法使得子类可以在不改变算法的结构的情况下,重定义算法中的某些特定步骤。核心组成:抽象类(AbstractClass):这个抽象类包含模板方法本身,同时也可......
  • 软件设计模式概述
    概述软件设计内容软件体系结构—宏观设计,模块软件设计模式—中间级别,类,接口,模块数据结构与算法—微观设计,方法是什么设计经验的总结七个常用原则单一职责原则就一个类而言,应该仅有一个引起他变化的原因为什么当一个类职责过多,一个职责的变化可能影响......