备忘录

设计模式(备忘录模式)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-22 22:18:10
参考:Learning hard 1.理解 :备忘录模式就是对某个类的状态进行保存下来,等到需要恢复的时候,可以从备忘录中进行恢复。生活中这样的例子经常看到,如备忘电话通讯录,备份操作操作系统,备份数据库等。 2.模式中的角色如下 :1. 发起人角色 :记录当前时刻的内部状态,负责创建和恢复备忘录数据。          2. 备忘录角色 :负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态。          3. 管理者角色 :负责保存备忘录对象 下面是一个实例,手机通讯录联系人备份与还原,可以备份不同的版本,并且还原 3.代码: using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using System.Linq; namespace ConsoleApplication1 {   //联系人   public class ContactPerson   {     public string Name { get;set;}     public

python 设计模式之备忘录模式

谁都会走 提交于 2020-02-22 21:04:14
1.为什么用备忘录模式 假设大战僵尸游戏共10关,越是往后关卡越难,越难就越是费时间费钱费精力。 开始大战僵尸,玩了好久好久终于玩到了第9关,真是不容易。 这个时候开始玩第9关了,哇,好难啊,真不幸,输掉了。 好沮丧,只能从第一关再来一轮了。 要是第9关玩输了以后,直接再从第9关开始玩,而不是从头再来。那该多好呀,会省不少时间的。 那能不能把玩到第9关这个游戏进度给保存下来 能 用备忘录模式 2. 定义 : 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 在备忘录模式中,如果要保存的状态多,可以创造一个备忘录管理者角色来管理备忘录 3.备忘录模式的优点 1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时, 使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需 要的这些状态的版本。 3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。 4.备忘录模式的缺点: 1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。 2

大话设计模式之备忘录模式

百般思念 提交于 2020-02-22 21:02:23
备忘录模式   在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 涉及到的角色描述    originator(发起人): 负责创建一个备忘录memento,用来记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。originator可根据需要决定memento存储它的哪些内部状态    memento(备忘录): 负责存储originator的内部状态,并可防止originator以外的其他对象访问备忘录memento。备忘录有两个接口,caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。originator能够看到一个宽接口,允许它访问返回先前状态所需的所有数据。    caretaker(管理者): 负责保存好备忘录memento,不能对备忘录的内容进行操作或检查。 优点:   1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。   2、实现了信息的封装,使得用户不需要关心状态的保存细节。 缺点:   消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。 使用场景:   1、需要保存/恢复数据的相关状态场景。   2、提供一个可回滚的操作。 具体代码实现   创建备忘录 package com.chenpt

【23】备忘录模式(Memento Pattern)

家住魔仙堡 提交于 2020-02-22 20:59:29
  一、引言   在上一篇博文分享了访问者模式,访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离。而今天要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式保存的是发起人的状态(而状态对应的数据结构,如属性)。下面具体来看看备忘录模式。   二、备忘录模式介绍    2.1 备忘录模式的定义   从字面意思就可以明白,备忘录模式就是对某个类的状态进行保存下来,等到需要恢复的时候,可以从备忘录中进行恢复。生活中这样的例子经常看到,如备忘电话通讯录,备份操作操作系统,备份数据库等。    备忘录模式的具体定义是:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。    2.2 备忘录模式的结构图   介绍完备忘录模式的定义之后,下面具体看看备忘录模式的结构图:      备忘录模式中主要有三类角色:   1)发起人角色:记录当前时刻的内部状态,负责创建和恢复备忘录数据。   2)备忘录角色:负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态。   3)管理者角色:负责保存备忘录对象。    2.3 备忘录模式的实现   下面以备份手机通讯录为例子来实现了备忘录模式,具体的实现代码如下所示:   // 联系人

C#设计模式-备忘录模式

浪子不回头ぞ 提交于 2020-02-22 20:58:12
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离。而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式保存的是发起人的状态(而状态对应的数据结构,如属性)。下面具体来看看备忘录模式。 一、 备忘录(Memento)模式 从字面意思就可以明白,备忘录模式就是对某个类的状态进行保存下来,等到需要恢复的时候,可以从备忘录中进行恢复。生活中这样的例子经常看到,如备忘电话通讯录,备份操作操作系统,备份数据库等。 备忘录模式的具体定义是: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。 二、 备忘录模式的结构 介绍完备忘录模式的定义之后,下面具体看看备忘录模式的结构图: 备忘录模式中主要有三类角色: 发起人角色: 记录当前时刻的内部状态,负责创建和恢复备忘录数据。 备忘录角色: 负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态。 管理者角色: 负责保存备忘录对象。 三、 备忘录模式的实现 下面以备份手机通讯录为例子来实现了备忘录模式,具体的实现代码如下所示: // 联系人 using System; using System.Collections.Generic; public class

设计模式之备忘录模式

若如初见. 提交于 2020-02-22 20:43:36
【定义】备忘录(Memento),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 【场景】备忘录模式,当然是在单机游戏里面用的多。比如角色扮演的《仙剑奇侠传》,在打Boss之前我们都会先保存当前进度,以便Boss没死,自己死了,好回到之前的存档点继续。 【UML】 【代码】 #include <iostream> using namespace std; //备忘录 class Memento { private: int vitality; //生命值 int attack; //攻击值 int defence; //防御值 public: Memento():vitality(0), attack(0), defence(0){} Memento(int v, int a, int d):vitality(v), attack(a), defence(d){} int get_vitality() { return vitality; } void set_vitality(int v) { vitality = v; } int get_attack() { return attack; } void set_attack(int a) { attack = a; } int get_defence()

备忘录模式

人盡茶涼 提交于 2020-02-22 20:40:13
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。 /** * Originator(发起人):负责创建一个备忘录Memeto, * 用以记录当前它的内部状态,并可使用备忘录恢复内部状态。 * Originator可根据需要决定Mometo存储Originator的那些内部状态。 */ public class Originator { private String state; public void setState(String state) { this.state = state; } public String getState() { return state; } /** * 创建备忘录,将当前需要保存的信息导入 * * @return 实例化出一个Memeto对象 */ public Memento createMemeto() { return new Memento(state); } /** * 恢复备忘录,将Memeto导入并将相关数据恢复 * @param memento */ public void setMemeto(Memento memento) { state = memento.getState(); } public void show(){ System.out

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

给你一囗甜甜゛ 提交于 2020-02-22 17:16:37
本笔记摘抄自: https://www.cnblogs.com/PatrickLiu/p/8176974.html ,记录一下学习过程以备后续查用。 一、引言 今天我们要讲行为型设计模式的第十个模式--备忘录模式,先从名称上来看。备忘录模式可以理解为对某个对象的状态进行保存,等到需要恢复的时 候,可以从备忘录中进行恢复。生活中这样的例子也能经常看到,如备份电话通讯录、操作系统、数据库等。如果我们想恢复对象的状态,那么我们可 能首先想到的是把对象保存下来,但是这样会破坏对象的封装性。因为对象有状态有操作,如果我们为了保存状态而留着原来的对象,做一个深拷贝, 那么其它对象也能通过这个对象的接口来访问这个对象状态,这并不是我们所希望的。我们需要它的职责只是保存和恢复对象状态,而不应在上面支持 对对象状态访问的接口,这就产生了Memento模式。 看上图,一个对象会有很多状态。这些状态会相互转变而促进对象的发展,如果要想在某一时刻把当前对象恢复到以前某一时刻的状态,这个情况用 “备忘录模式”就能很好解决。 二、备忘录模式介绍 备忘录模式:英文名称--Memento Pattern;分类--行为型。 二、备忘录模式的详细介绍 2.1、动机(Motivate) 在软件构建过程中,某些对象的状态在转换的过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接

备忘录模式(详解版)

旧巷老猫 提交于 2020-02-22 06:33:14
每个人都有犯错误的时候,都希望有种“后悔药”能弥补自己的过失,让自己重新开始,但现实是残酷的。在计算机应用中,客户同样会常常犯错误,能否提供“后悔药”给他们呢?当然是可以的,而且是有必要的。这个功能由“备忘录模式”来实现。 其实很多应用软件都提供了这项功能,如 Word、记事本、Photoshop、Eclipse 等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。 备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。 模式的定义与特点 备忘录(Memento)模式 的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式 又叫快照模式。 备忘录模式是一种对象行为型模式,其主要优点如下。 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。 其主要缺点是

设计模式之备忘录模式

纵饮孤独 提交于 2020-02-20 20:01:14
备忘录模式 备忘录模式和原型模式: ​ 备忘录模式是保存对象当时的信息 , 而原型模式是调用clone()方法进行对象的克隆 , 所以我认为可以将备忘录模式进行修改 , 保存对象信息可以直接使用clone()克隆对象 , 然后保存到备忘录中 , 但是这就涉及到浅拷贝和深拷贝的问题 , 如果我们的 “发起人类” (Originator) 内部引用类型稍微复杂的话 , 建议不去使用clone()方法 , 而直接进行信息的保存 . 定义: ​ 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态。备忘录模式就像我们大家玩的游戏存档一样 , 当我们打不过BOSS时 , 就可以先保存游戏进度 , 然后再去进行下一步的行动 . 这样方便我们再次从想要的位置开始。 使用场景: 需要保存一个对象在某一个时刻的状态或部分状态。 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。 浏览器回退、数据库备份和恢复、编辑器撤销和还原、虚拟机生成快照和恢复、Git版本控制、棋牌类游戏悔棋等等。 UML: Main:它是一个普通类,可以创建一个备忘录,并存储它的当前内部状态,也可以使用备忘录来恢复其内部状态