1.16(设计模式)备忘录模式
时间:2019-06-12
本文章向大家介绍1.16(设计模式)备忘录模式,主要包括1.16(设计模式)备忘录模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
备忘录模式,在不破坏对象封装的情况下,获取对象状态并将其保存下来。
比如游戏关卡的存档。
游戏状态类
通过saveStatefToMemento()方法存储状态
public class Originator { //攻击力 private int aggressivity; //防御力 private int defense; //关卡 private int checkpoint; public Originator(int aggressivity, int defense, int checkpoint) { super(); this.aggressivity = aggressivity; this.defense = defense; this.checkpoint = checkpoint; } public int getAggressivity() { return aggressivity; } public int getDefense() { return defense; } public int getCheckpoint() { return checkpoint; } public void setAggressivity(int aggressivity) { this.aggressivity = aggressivity; } public void setDefense(int defense) { this.defense = defense; } public void setCheckpoint(int checkpoint) { this.checkpoint = checkpoint; } public void setAll(int aggressivity, int defense, int checkpoint) { this.aggressivity = aggressivity; this.defense = defense; this.checkpoint = checkpoint; } //保存状态 public Memento saveStatefToMemento() {//使用一个Memento类保存状态,可以保证Originator的封装性 return new Memento(aggressivity, defense, checkpoint); } //获取状态 public void getStateFromMemento(Memento memento) { this.aggressivity = memento.getAggressivity(); this.defense = memento.getDefense(); this.checkpoint = memento.getCheckpoint(); } @Override public String toString() { return "Originator [aggressivity=" + aggressivity + ", defense=" + defense + ", checkpoint=" + checkpoint + "]"; } }
保存游戏状态的类
该类的属性时根据Originator 类的属性设置的,
通过该类保存游戏状态,可以保证原有类的封装性。
public class Memento { //攻击力 private int aggressivity; //防御力 private int defense; //关卡 private int checkpoint; public Memento(int aggressivity, int defense, int checkpoint) { super(); this.aggressivity = aggressivity; this.defense = defense; this.checkpoint = checkpoint; } public int getAggressivity() { return aggressivity; } public int getDefense() { return defense; } public int getCheckpoint() { return checkpoint; } }
获取存储状态的类
import java.util.HashMap; import java.util.Map; public class CareTaker { private Map<String,Memento> mementosMap = new HashMap<String,Memento>(); public void add(String keepInTheArchivesName,Memento memento) { mementosMap.put(keepInTheArchivesName, memento); } public Memento get(String keepInTheArchivesName) { return mementosMap.get(keepInTheArchivesName); } }
Main
public class Main { public static void main(String[] args) { Originator originator = new Originator(0, 0, 0); CareTaker careTaker = new CareTaker(); originator.setAll(100,50,1); originator.setAll(200,70,2); careTaker.add("存档一(已过第二关)",originator.saveStatefToMemento()); originator.setAll(400,100,3); careTaker.add("存档一(已过第三关)",originator.saveStatefToMemento()); originator.setAll(500,150,4); System.out.println("current:" + originator); System.out.println("获取存档一状态"); originator.getStateFromMemento(careTaker.get("存档一(已过第二关)")); System.out.println(originator); System.out.println("获取存档二状态"); originator.getStateFromMemento(careTaker.get("存档一(已过第三关)")); System.out.println(originator); } }
运行结果:
current:Originator [aggressivity=500, defense=150, checkpoint=4] 获取存档一状态 Originator [aggressivity=200, defense=70, checkpoint=2] 获取存档二状态 Originator [aggressivity=400, defense=100, checkpoint=3]
参考资料:
https://www.runoob.com/design-pattern/memento-pattern.html
原文地址:https://www.cnblogs.com/huang-changfan/p/11010899.html
- Polyspace不认识Interrupt,肿么办?
- 1639: [Usaco2007 Mar]Monthly Expense 月度开支
- 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通
- 1642: [Usaco2007 Nov]Milking Time 挤奶时间
- 1625: [Usaco2007 Dec]宝石手镯
- 1613: [Usaco2007 Jan]Running贝茜的晨练计划
- 1677: [Usaco2005 Jan]Sumsets 求和
- 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
- 1602: [Usaco2008 Oct]牧场行走
- 【LeetCode 500】关关的刷题日记27 Keyboard Row
- 1601: [Usaco2008 Oct]灌水
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
- 1610: [Usaco2008 Feb]Line连线游戏
- 1012: [JSOI2008]最大数maxnumber
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL参数是啥,你知道吗?
- 使用v-model对父子组件进行双向绑定
- Astar Algorithm
- 树状数组解析
- Cypress系列(44)- 命令行运行 Cypress
- Cypress系列(45)- cypress-skip-and-only-ui 插件详解
- 多线程基础(五):java对象的MarkWord及synchronized锁升级过程
- 【每日一题】45. Jump Game II
- 「Elasticsearch + Lucene」搜索引擎的架构、倒排索引和搜索过程
- 查看 MAC JDK默认安装路径 JAVA路径 的shell 命令
- Gradle 命令行介紹和安裝教程
- Spring工厂创建复杂对象
- Nginx反向代理配置去除前缀
- 深入浅出java虚拟机
- Maven resources 分环境