行为型模式 - 备忘录模式Memento
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

模式的定义与特点
在备忘录模式(Memento Pattern)下,为的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
模式的优点
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
模式的缺点
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
- 为了符合迪米特原则,还要增加一个管理备忘录的类。

举例使用场景
我们写代码的时候,写着写着发现有问题,只好Ctrl+Z或者Command+Z撤回;又好像是游戏中的存档问题;也像是Git和SVN的版本控制;再或关卡编辑器。
using DesignPattern.ChainofResponsibilityPattern;
using DesignPattern.MementoPattern;
using DesignPattern.ObserverPattern;
using DesignPattern.VisitorPattern;
using System;
using System.Collections.Generic;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
MementoHelper();
}
#region Pattern - Memento
static void MementoHelper()
{
Originator _originator = new Originator();
CareTaker _careTaker = new CareTaker();
_originator.SetInfo("Name 1", 10);
_careTaker.Add(_originator.SaveInfoToMemento());
_originator.SetInfo("Name 2", 18);
_originator.SetInfo("Name 3", 25);
_careTaker.Add(_originator.SaveInfoToMemento());
_originator.SetInfo("Name 4", 80);
Console.WriteLine("当前信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
_originator.GetInfoFromMemento(_careTaker.Get(0));
Console.WriteLine("第一次保存信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
_originator.GetInfoFromMemento(_careTaker.Get(1));
Console.WriteLine("第二次保存信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
Console.ReadLine();
}
#endregion
}
}
//====================================================================================================================
namespace DesignPattern.MementoPattern
{
/// <summary>
/// 备忘录
/// 包含了要被恢复的对象的状态
/// </summary>
public class Memento
{
//也可以为别的内容,eg: 一个class
private string m_name;
private int m_age;
public Memento(string name, int age)
{
this.m_name = name;
this.m_age = age;
}
public string GetName()
{
return m_name;
}
public int GetAge()
{
return m_age;
}
}
/// <summary>
/// 管理人
/// 负责从 Memento 列表中恢复 Memento 存储对象到某一状态。
/// </summary>
public class CareTaker
{
public CareTaker()
{
m_mementoList = new List<Memento>();
}
private List<Memento> m_mementoList;
public void Add(Memento state)
{
m_mementoList.Add(state);
}
public Memento Get(int index)
{
return m_mementoList[index];
}
}
/// <summary>
/// 发起人,可以是被存储对象,也可以是被存储对象的class.
/// 创建 Memento 并在被创建的 Memento 对象中存储 该被存储的内容
/// </summary>
public class Originator
{
private string m_name;
private int m_age;
public void SetInfo(string name, int age)
{
this.m_name = name;
this.m_age = age;
}
public string GetName()
{
return m_name;
}
public int GetAge()
{
return m_age;
}
public Memento SaveInfoToMemento()
{
return new Memento(m_name, m_age);
}
public void GetInfoFromMemento(Memento Memento)
{
m_name = Memento.GetName();
m_age = Memento.GetAge();
}
}
}

希望大家:点赞,留言,关注咯~
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
今日推荐
行为型模式 - 备忘录模式Memento的更多相关文章
- c++ 行为型_备忘录模式(Memento)
行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...
- 【设计模式】行为型07备忘录模式(Memento Pattern)
参考地址:http://www.runoob.com/design-pattern/memento-pattern.html 对原文总结调整,以及修改代码以更清晰的展示: 备忘录模式(快照模式): ...
- java设计模式--行为型模式--备忘录模式
备忘录模式,我们平常所做的备忘录么.还得深深研究哦. 备忘录模式: 备忘录模式 概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状 ...
- 设计模式20---设计模式之备忘录模式(Memento)(行为型)
1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...
- 设计模式(18)--Memento(备忘录模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...
- 设计模式-行为型模式,python备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...
- javascript设计模式--备忘录模式(Memento)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 18、Memento 备忘录模式
例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...
- C#设计模式学习笔记:(22)备忘录模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8176974.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十个模式--备 ...
- php 23种设计模式 - 备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...
随机推荐
- appium 移动端自动化测试工具
appium 移动端自动化测试工具 appium 移动端自动化测试工具 appium 是哟个自动化测试开源工具 支持ios和安卓平台的应用 以及web应用和混合应用 appium 是一个跨平台的工具: ...
- python进阶(26)collections标准库
前言 这个模块实现了特定目标的容器,以提供Python标准内建容器dict ,list ,set , 和tuple 的替代选择. 这个模块提供了以下几个函数 函数 作用 namedtuple() 创建 ...
- 基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群
Sealos 是一个快速构建高可用 k8s 集群的命令行工具,该工具部署时会在第一个 k8s master 节点部署 registry 服务(sealos.hub),该域名通过 hosts 解析到第一 ...
- hwlog---api.go
// Copyright(c) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...
- c++详细学习——引用
1 引用(reference) 引用是一个变量的别名,故引用在申明的时候必须给初始值,从此他们就建立了"不能离婚的婚姻关系",改变引用就会改变被引用的原变量 1 int main( ...
- postgresql函数:定期删除模式下指定天数前的表数据及分区物理表
一.现有函数-- 1.现有函数调用select ods.deletePartitionIfExists('fact_ship' || '_' || to_char(CURRENT_DATE - INT ...
- 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑.这是一款无与伦比.超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的 ...
- 全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决
目录 全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决 1. 拉取阿里镜像oracle 2. 创建初始化数据 ...
- [百度营]AI studio用法提醒(自用)
持久化安装 需要设置持久化路径: !mkdir /home/aistudio/external-libraries !pip install beautifulsoup4 -t /home/aistu ...
- python Modbus 进行通讯时抛出Modbus Error: Exception code = 2
源码: import modbus_tk from modbus_tk import modbus_tcp import modbus_tk.defines as cst PORT = 'com1' ...