设计模式之备忘录模式(Memento Pattern)
文章目录
- 一、设计模式的定义
- 二、优缺点
- 2.1、优点:
- 2.2、缺点:
- 三、备忘录模式的角色和UML类图
- 3.1、角色如下:
- 3.2、UML类图
- 四、游戏角色攻击力备份的示例
- 4.1、代码:
- 4.1.1、Originator:发起人
- 4.1.2、Memento: 备忘录
- 4.1.3、Caretaker :管理者
- 4.1.4、Client
- 4.1.5、运行结果:
- 五、QQ信息备份的示例
- 5.1、代码:
- 5.1.1、OriginatorForUserInfo:用户信息类(发起人)
- 5.1.2、Memento: 备忘录
- 5.1.3、Caretaker:负责人
- 5.1.4、Client
- 5.1.4、运行结果:
很多应用软件都备份、恢复的功能,如 Word、记事本等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;
还有在 IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。
通俗来讲,备忘录 就是备份,备份到当前对象之外,当需要可以从外部引入,从而恢复当初的状态。
备忘录模式 就是 记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
一、设计模式的定义
设计模式是 在不破坏封装性的前提下,将对象当前的内部状态保存在对象之外,以便以后当需要时能将该对象恢复到原先保存的状态。
备忘录模式又叫快照模式,是一种对象行为型模式。
二、优缺点
2.1、优点:
- 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
- 实现了内部状态的封装。除了创建它的发起类之外,其他对象都不能够访问这些状态信息。
- 简化了发起类。发起类不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
2.2、缺点:
资源消耗大。
如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
三、备忘录模式的角色和UML类图
3.1、角色如下:
Originator
(发起人):``发起人可以创建一个
Memento,并存储它的当前状态,也可以使用
Memento` 来恢复其内部状态。(
发起人
就是 被备份的对象, 备份的是Originator
内部的部分数据,而不是整 个对象)。Memento
(备忘录):备份的最小单元。备忘录对象不能直接被其他类使用,根据Originator
来决定保存哪些内部状态。Caretaker
(管理者、负责人):对Memento
进行管理,保存一个或多个备忘录对象,提供获取Memento
的功能,但不能对Memento
的进行访问与修改。
3.2、UML类图
四、游戏角色攻击力备份的示例
游戏角色具有攻击力,战斗前保存自身的状态(攻击力),当战斗力下降时,从备忘录对象中恢复到大战之前的状态。
4.1、代码:
4.1.1、Originator:发起人
/*** 发起人*/
public class Originator {/** 状态信息 */private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}/*** 创建一个可以保存状态的Memento对象* * @return*/public Memento createMemento() {return new Memento(state);}/*** 通过备忘录对象,恢复状态* @param memento*/public void getMemento(Memento memento) {state = memento.getState();}
}
4.1.2、Memento: 备忘录
/*** 备忘录*/
public class Memento {private String state;//构造器public Memento(String state) {super();this.state = state;}public String getState() {return state;}
}
4.1.3、Caretaker :管理者
/*** 管理者* <pre>* 对备忘录进行管理* </pre>*/
public class Caretaker {//在List 集合中会有很多的备忘录对象private List<Memento> mementoList = new ArrayList<Memento>();public void save(Memento memento) {mementoList.add(memento);}//获取到第index个Originator 的备忘录对象(即保存状态)public Memento get(int index) {return mementoList.get(index);}
}
4.1.4、Client
public class Client {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("状态#1 攻击力 100");//保存了当前的状态caretaker.save(originator.createMemento());originator.setState("状态#2 攻击力 80");caretaker.save(originator.createMemento()); originator.setState("状态#3 攻击力 50");caretaker.save(originator.createMemento()); System.out.println("当前的状态是 " + originator.getState());//希望得到状态 1, 将 originator 恢复到状态1originator.getMemento(caretaker.get(0));System.out.println("恢复到状态1 , 当前的状态是");System.out.println("当前的状态是 " + originator.getState());}
}
4.1.5、运行结果:
当前的状态是 状态#3 攻击力 50
恢复到状态1 , 当前的状态是
当前的状态是 状态#1 攻击力 100
五、QQ信息备份的示例
对QQ信息进行备份,起初时,QQ的昵称是奋斗、昵称是周杰伦的头像,
后来改为QQ的昵称是鹿娘娘、昵称是李现的头像,
每次修改前要备份上一次的状态,可以随时恢复某一时刻的状态。
5.1、代码:
5.1.1、OriginatorForUserInfo:用户信息类(发起人)
/*** QQ信息(发起人)*/
public class OriginatorForUserInfo {/** QQ号码 */private String qqNumber;/** 昵称 */private String nickname;/** 头像照片 */private String pic;public String getQqNumber() {return qqNumber;}public void setQqNumber(String qqNumber) {this.qqNumber = qqNumber;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}/*** 保存备忘录* * @return 返回一个新的备忘录对象*/public Memento createMemento() {return new Memento(nickname, pic);}/*** 恢复备忘录对象*/public void restoreMemento(Memento memento) {this.nickname = memento.getNickname();this.pic = memento.getPic();}/*** 显示用户信息*/public void show() {System.out.println("qqNumber:" + qqNumber);System.out.println("nickname:" + nickname);System.out.println("pic:" + pic);}
}
5.1.2、Memento: 备忘录
/*** 备忘录*/
public class Memento {/** 昵称 */private String nickname;/** 头像照片 */private String pic;private Memento() {}public Memento(String nickname, String pic) {super();this.nickname = nickname;this.pic = pic;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}
}
5.1.3、Caretaker:负责人
/*** 负责人*/
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void saveMemento(Memento memento) {this.memento = memento;}
}
5.1.4、Client
/*** 测试类*/
public class Client {public static void main(String[] args) {// 原发人OriginatorForUserInfo originator = new OriginatorForUserInfo();// 负责人Caretaker caretaker = new Caretaker();originator.setQqNumber("11111");originator.setNickname("123456");originator.setPic("周杰伦的头像");show(originator, "初始状态");// 保存状态caretaker.saveMemento(originator.createMemento());// 修改昵称、电头像照片originator.setNickname("654321");originator.setPic("李现的头像");show(originator, "修改状态后");// 恢复状态一originator.restoreMemento(caretaker.getMemento());show(originator, "恢复到初始状态后");}private static void show(OriginatorForUserInfo originator, String status) {System.out.println(status + ":");originator.show();System.out.println("==========================");}
}
5.1.4、运行结果:
初始状态:
qqNumber:11111
nickname:奋斗
pic:周杰伦的头像
==========================
修改状态后:
qqNumber:11111
nickname:鹿娘娘
pic:李现的头像
==========================
恢复到初始状态后:
qqNumber:11111
nickname:奋斗
pic:周杰伦的头像
==========================
设计模式之备忘录模式(Memento Pattern)相关推荐
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...
- java memento_备忘录模式-Memento Pattern(Java实现)
备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...
- 保留状态的秘密 - 深入了解Java备忘录模式(Memento Pattern)
文章目录 一.概述 1.1 介绍备忘录模式的定义和作用 二.角色 2.1 介绍备忘录模式中的三个角色 三.实现方法 3.1 介绍备忘录模式的实现方法 3.2 分别介绍基于类和基于接口实现备忘录模式的方 ...
- Net设计模式实例之备忘录模式(Memento Pattern)
一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...
- 设计模式之备忘录模式(Memento)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办
23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...
- 【设计模式】—— 备忘录模式Memento
前言:[模式总览]----------by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic;namespace ConsoleApplication6 {/// <summary>/// ...
- 38备忘录模式(Memento Pattern)
对象状态的回溯: 对象状态的变化无端,如何回溯/恢复对象在某个点的状态? 动机: 在软件构建过程中,某些对象的状态在转换过程中,可能由 ...
- 设计模式-备忘录模式(Memento)-Java
设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...
最新文章
- 临时表,临时表什么时候删除
- 为何把日志打印到控制台很慢?
- 题目1009:二叉搜索树
- 【Unity笔记】使用协程(Coroutine)异步加载场景
- Python时间库—datetime的详解及使用
- V神:区块链跨链技术大规模应用将在一到两年内爆发
- P2490-[SDOI2011]黑白棋【博弈论,dp】
- Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建
- python-socket2
- HDU 2256Problem of Precision(矩阵快速幂)
- leetcode 877 stone game
- php 检测字符长度,php验证字符串长度问题
- 74 系列COMS系列逻辑器件芯片功能大全
- 中级软件设计师知识点总结
- oracle 中dummy,layout设计中dummy的作用详解(上图。好贴好贴,讲的很仔细)
- 什么是Subscript?
- 有关“A New Adversarial Embedding Method for Enhancing Image Steganography“的理解
- Banner轮播图的基本使用
- ABP理论学习之本地化
- 利用Grafana为你的Loki添加告警