学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

模式的定义与特点

备忘录模式(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的更多相关文章

  1. c++ 行为型_备忘录模式(Memento)

    行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...

  2. 【设计模式】行为型07备忘录模式(Memento Pattern)

    参考地址:http://www.runoob.com/design-pattern/memento-pattern.html 对原文总结调整,以及修改代码以更清晰的展示: 备忘录模式(快照模式):   ...

  3. java设计模式--行为型模式--备忘录模式

    备忘录模式,我们平常所做的备忘录么.还得深深研究哦. 备忘录模式: 备忘录模式 概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状 ...

  4. 设计模式20---设计模式之备忘录模式(Memento)(行为型)

    1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...

  5. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  6. 设计模式-行为型模式,python备忘录模式

    备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...

  7. javascript设计模式--备忘录模式(Memento)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 18、Memento 备忘录模式

    例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...

  9. C#设计模式学习笔记:(22)备忘录模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8176974.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十个模式--备 ...

  10. php 23种设计模式 - 备忘录模式

    备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...

随机推荐

  1. "xxx cannot be cast to jakarta.servlet.Servlet "报错解决方式

    在做jsp的上机时候同学出现了一个500错误:com.kailong.servlet.ComputeBill cannot be cast to jaka.servlet.Servlet 然后因为我用 ...

  2. Day2:基本的Dos命令

    打开CMD的方式 开始+系统+命令提示符(右键以管理员身份运行可拿到最高权限) Win键+R 输入 cmd打开控制台(推荐使用) 桌面上按住shift+鼠标右键,打开powershell窗口 文件搜索 ...

  3. zk系列三:zookeeper实战之分布式锁实现

    一.分布式锁的通用实现思路 分布式锁的概念以及常规解决方案可以参考之前的博客:聊聊分布式锁的解决方案:今天我们先分析下分布式锁的实现思路: 首先,需要保证唯一性,即某一时点只能有一个线程访问某一资源: ...

  4. 本地文件上传Gitee

    0.对于小白来说,我再细讲一下 一.下载git 下载细节参考博客 二.Git配置 点击桌面的图标,进入Git Bash Here 1.配置自己的用户名和邮箱 git config --global u ...

  5. Vue.js3.0练习题

    第一章:Vue 3.0 概述 1.选择题 1.1.在MVVM设计模式中,Model代表的是_______. A. 数据模型        B. 控制器       C. 视图      D.监听模型 ...

  6. 思维分析逻辑 3 DAY

    目录 指标分析 指标选择原则 指标体系建立 步骤 流量分析 渠道分析(从哪来) 常见渠道及渠道分类 渠道推广过程 渠道的指标 渠道分析方法 转化及价值分析(经过什么?产生什么价值?) 漏斗分析 功能模 ...

  7. vue 项目中,后端返回文件流,导出excel

    之前写过文件流导出excel,这次直接把上次的代码拿过来复制粘贴,但是导出的表格里面没有数据,只显示undefined. 这是之前的代码 // api接口页面 // excel导出接口 export ...

  8. Go 快速入门指南 - 序言

    这本书是写什么的? 这是一本 Go 语言快速入门手册,目标读者是有任一编程语言基础,希望以最快的时间 (比如一个周末) 入门 Go 语言. 这本书应该怎么读? 书中几乎没有较长篇幅的理论知识,更多的是 ...

  9. java的饿汉和懒汉设计模式

    本文主要讲述java的饿汉和懒汉设计模式 饿汉和懒汉设计模式的目的:使得该类的对象,只能有一个,不允许其他类,创建该类的对象. 饿汉设计模式 示例代码如下: 1 public class Hunger ...

  10. 使用linux的ffmpeg进行B站直播推流

    很久之前买了个友善的开发板R2S,一直在家吃灰.最近看到网上有用ffmpeg进行直播推流的案例,想把吃灰的的开发板利用起来,于是有了这篇教程. 第一步:安装ffmpeg sudo apt update ...