当前位置: 首页 > news >正文

《golang设计模式》第三部分·行为型模式-06-备忘录模式(Memento)

文章目录

  • 1. 概述
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1. 概述

备忘录(Memento)用于在不破坏目标对象封装特性的基础上,将目标对象内部的状态存储到外部对象中,以备之后恢复状态时使用。

1.1 角色

  • Originator(发起者):当前的基础对象,它会将自己的状态保存进备忘录。
    • savememento()方法:Originator通过该方法将它自己状态保存进一个备忘录对象。
    • restorememento()方法:Originator通过该方法将它自己状态回滚至指定备忘录。
  • Memento(备忘录) : 存储Originator状态的对象
  • Caretaker(管理者):保存多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录。

1.2 类图

Originator
-state:State
+RestoreState(m:Memento)
+CreateMemento()
Memento
-state:State
+GetState()
Caretaker
+StoreMemento(m:Memento)
+GetMemento(c:Condition)

2. 代码示例

2.1 设计

  • 定义备忘录memento来记录发起者状态
  • 它的Get()方法获取它的状态
  • 定义发起者Originator
    • 它的方法 CreateMemento() 用它自己创建一条备忘录
    • 它的方法 RollBack() 将它自己回滚至指定备忘录的状态
    • 它的Set()方法可以设置它的状态
    • 它的Get()方法可以获取它的状态
  • 创建一个管理者Caretaker,它是备忘录Memento的聚合
    • 它的AddMemento方法,向它自身加入一条备忘录
    • 它的GetMemento()方法,查询一条它管理的指定备忘录
  • 调用
    • 初始化
      • 实例化一个管理者caretaker
      • 实例化一个发起者originator
    • 创建备忘录测试
      • 第一次
        • 用发起者创建一条备忘录
        • 管理者收录该备忘录
      • 第二次
        • 改变发起者状态
        • 用发起者创建一条新备忘录
        • 管理者收录该备忘录
      • 第三次
        • 改变发起者状态
        • 用发起者创建一条新备忘录
        • 管理者收录该备忘录
      • 查看管理者信息,应该有三条备忘录
    • 回滚测试
      • 从管理者获取指定索引的备忘录
      • 将发起者回滚至该备忘录状态

2.2 代码

  • 代码
package mainimport "fmt"// 定义备忘录
type Memento struct {state string
}// 查备忘录状态
func (m *Memento) Get() string {return m.state
}// 定义发起者
type Originator struct {state string
}// 根据发起者状态创建一条备忘录
func (e *Originator) CreateMemento() (memento *Memento) {memento = &Memento{state: e.state}fmt.Printf("创建一条备忘录:%+v\n", memento)return memento
}// 将发起者状态回滚至指定备忘录状态
func (e *Originator) RollBack(m *Memento) {e.state = m.Get()fmt.Printf("发起者状态回滚至:%v\n", e)
}// 设置发起者状态
func (e *Originator) Set(state string) {e.state = statefmt.Println("发起者状态更改为:", e.state)
}// 获取发起者状态
func (e *Originator) Get() string {fmt.Println("获取发起者状态为:", e.state)return e.state
}// 定义管理者,管理者是备忘录的聚合
type Caretaker struct {mementoArray []*Memento
}// 向管理者中添加一条备忘录
func (c *Caretaker) AddMemento(m *Memento) {fmt.Printf("向管理者中添加一条备忘录:%+v\n", m)c.mementoArray = append(c.mementoArray, m)
}// 获取指定备忘录信息
func (c *Caretaker) GetMemento(index int) *Memento {fmt.Printf("获取到第 %d 条备忘录信息为:%+v\n", index, c.mementoArray[index])return c.mementoArray[index]
}func main() {//实例化一个管理者caretaker := &Caretaker{mementoArray: make([]*Memento, 0),}//实例化一个发起者originator := &Originator{state: "A",}//为发起者创建一条备忘录memento0 := originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento0)//改变发起者状态originator.Set("B")//为发起者创建第二条备忘录memento1 := originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento1)//再次改变发起者状态originator.Set("C")//为发起者创建第三条备忘录memento2 := originator.CreateMemento()//在管理者中加入该备忘录caretaker.AddMemento(memento2)fmt.Println("此时管理者应该有三条备忘录:")for _, memento := range caretaker.mementoArray {fmt.Printf("%+v\n", memento)}fmt.Println("=========回滚测试===========")originator.RollBack(caretaker.GetMemento(1))fmt.Println("=========回滚测试===========")originator.RollBack(caretaker.GetMemento(0))
}
  • 输出
创建一条备忘录:&{state:A}
向管理者中添加一条备忘录:&{state:A} 
发起者状态更改为: B
创建一条备忘录:&{state:B}
向管理者中添加一条备忘录:&{state:B} 
发起者状态更改为: C
创建一条备忘录:&{state:C}
向管理者中添加一条备忘录:&{state:C} 
此时管理者应该有三条备忘录
&{state:A}
&{state:B}
&{state:C}
=========回滚测试===========
获取到第 1 条备忘录信息为:&{state:B}
发起者状态回滚至:&{B}
=========回滚测试===========
获取到第 0 条备忘录信息为:&{state:A}
发起者状态回滚至:&{A}

2.3 类图

Originator
-string:State
+CreateMemento()
+RollBack(m *Memento)
+Set(state string)
+Get()
Memento
-String:State
+Get()
Caretaker
+[]*Memento:mementoArray
+AddMemento(m *Memento)
+GetMemento(index int) : Memento

在这里插入图片描述

相关文章:

《golang设计模式》第三部分·行为型模式-06-备忘录模式(Memento)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 备忘录(Memento)用于在不破坏目标对象封装特性的基础上,将目标对象内部的状态存储到外部对象中,以备之后恢复状态时使用。 1.1 角色 Originato…...

Cache学习(4):Cache分配策略Cache更新策略Cache逐出策略

Cache的数据流 常用名词 Allocation 分配Eviction 驱逐分配策略和更新策略分别为当产生Cache miss和Cache hit的时候数据流的具体行为 1 Cache分配策略(Cache Allocation Policy) Cache的分配策略是指不同情况下为数据分配Cache Line的不同行为。Cac…...

角色管理--产品经理岗

研发组织管理--角色管理--产品经理岗 定位 相对稳定和简单产品的独立产品打造者,复杂产品的辅助者 所需资质 校招新人,拥有灵性拥有基础的产品力(认知,设计,创新,推进,学习)Axur…...

SQL数据迁移实战:从产品层级信息到AB测试表

文章目录 创建表插入数据清空数据表数据迁移和筛选查询数据结论 创建表 首先,代码中定义了两个表格:dim_prod_hierarchy_info 和 app_abtest_product_info,都位于 test 数据库中。 dim_prod_hierarchy_info 表用于存储产品层级信息&#xf…...

VMware系列:VMware安装Android虚拟机

VMware系列:VMware安装Android虚拟机 一. 下载镜像这里提供了三种下载镜像方式,也就是三个下载链接,这里推荐百度网盘下载二. 使用VMware Workstation Pro 创建新的虚拟机操作系统应该可以选择任意一个,笔者只试过下图中,如果读者感兴趣可以多试几个,但笔者不保证每个都可…...

链接1:编译器驱动程序

文章目录 GNU编译器示例编译 GNU编译器 GNU编译器(GNU Compiler)是由自由软件基金会(Free Software Foundation,FSF)开发和维护的一套编译器集合。这些编译器主要用于编译各种编程语言的源代码,将其转换为…...

经典滑动窗口试题(二)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、水果成篮1、题目讲解2、讲解算法思路3、代码实现 二、找到字符串中所有字母异位词1、题目…...

easyexcel指定sheet页动态给行列加背景色

需求 1、easyexcel,有多个sheet页,某些sheet页的行、列动态需要加背景色。 2、扩展支持cellStyle标记单元格超过64000 import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.…...

设计模式在实际业务中应用 - 模版方法

1. 业务背景 作者在工作中主要主导 A 业务线的系统建设,A 业务线主要是零售场景酒水的售卖与即时配送服务。为了方便运营在自研系统中对多平台商品进行管理而开发的三方平台商品管理功能,本次介绍的模版方法模式则是在该功能开发过程中的落地实践。 2.…...

BGP综合实验

任务如下: 1.AS1存在两个环回,一个地址为192.168.1.0/24该地址不能在任何协议中宣告 AS3存在两个环回,一个地址为192.168.2.0/24该地址不能在任何协议中宣告,最终要求这两个环回可以互相通讯 2.整个AS2的IP地址为172.16.0.0/16&…...

Global Surface Summary of the Day 全球逐日气象站点数据 GSOD数据集

数据名称 Global Surface Summary of the Day 数据内容 数据包含以下气象要素的日值观测数据: 气压:平均气压、海平面气压;气温:平均气温、日最高气温、日最低气温;湿度:露点温度(需自行换算…...

Harmony OS4开发入门

代码地址: https://gitee.com/BruceLeeAdmin/harmonyos/tree/master 项目目录介绍 ArkTS介绍 简单案例: State times: number 0/*数据类型:stringnumberany: 不确定类型,可以是任意类型*/State msg: string "hello"…...

.net core 事务

在 .NET Core 中,可以使用 Entity Framework Core 来实现事务处理。下面是一个简单的示例,展示了如何在 .NET Core 中使用 Entity Framework Core 来创建和执行事务: using System; using Microsoft.EntityFrameworkCore; using System.Tran…...

【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...

MPPT工作流程及算法和硬件的选择

MPPT算法选择 目前,MPPT算法有开路电压比率(离线)、短路电流比率(离线)、观察调节(在线)、极限追踪控制法(在线)。 在光伏控制系统中,因为日照、温度等条件的变化,光伏电池的输出功率也是在不断变化的,为保证使得光伏电池的输出功…...

C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// 除法运算为 Truffer…...

每日一练【移动零】

一、题目描述 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 二、题目解析 可以…...

QT修改windowTitle的名字以及图片

1.修改名字:点击ui的QMainWindow,然后找到windowTitle的选项修改即可 2.修改windowTitle的图片,依旧是找到windowIcon,选择资源,这个资源可以是你放到qrc里面的图片也可以是外置的图片 3.然后运行就可以看到效果了...

C语言-指针讲解(3)

文章目录 1.字符指针变量1.1 字符指针变量类型是什么1.2字符指针变量的两种使用方法&#xff1a;1.3字符指针笔试题讲解1.3.1 代码解剖 2.数组指针变量2.1 什么是数组指针2.2 数组指针变量是什么&#xff1f;2.2.3 数组指针变量的举例 2.3数组指针和指针数组的区别是什么&#…...

慢 SQL 分析及优化

目录 分析慢 SQL SQL 优化 单表优化 多表优化 慢 SQL&#xff1a;指 MySQL 中执行比较慢的 SQL排查慢 SQL 最常用的方法&#xff1a;通过慢查询日志来查找慢 SQL MySQL 的慢查询日志是 MySQL 提供的一种日志记录&#xff0c;它用来记录在 MySQL 中响应时间超过阈值的语句&…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...