本文主要是介绍Java设计模式(21):备忘录模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
21,备忘录模式(Memento)
21.1,问题引入_游戏角色恢复问题
- 游戏角色有攻击力和防御力,在大战BOSS前保存自身的状态,当大战BOSS后攻击力和防御力下降,从备忘录中恢复初始状态
- 在传统方式中,new对象简单做备份,再需要恢复数据时,从新对象中取初始数据进行覆盖,这样会暴露对象的内部实现细节
- 这时候可以通过备忘录模式实现
21.2,基本介绍
- 备忘录模式(Memento Pattern):行为型模式;在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于在后续对该对象进行恢复
- 备忘录模式可以对对象状态变更的全过程进行记录,可以随时恢复到指定时期状态
21.3,类图
Origination
:原始类,定义基本数据结构,及备忘录对象的生成方式及恢复方式Memento
:备忘录类,进行原始基础数据保存Caretaker
:备忘录对象守护者类,进行备忘录对象的保存和获取
21.4,代码实现
-
Origination
:原始类package com.self.designmode.memento;/*** 备忘录模式: 原型类* @author PJ_ZHANG* @create 2020-12-17 10:39**/ public class Origination {// 攻击力private int vit;// 防御力private int def;public int getVit() {return vit;}public void setVit(int vit) {this.vit = vit;}public int getDef() {return def;}public void setDef(int def) {this.def = def;}public Origination(int vit, int def) {this.vit = vit;this.def = def;}/*** 保存当前对象状态到备忘类* @return*/public Memento saveMemento() {return new Memento(vit, def);}/*** 从备忘录中恢复状态* @param memento*/public void recoverMemento(Memento memento) {this.def = memento.getDef();this.vit = memento.getVit();}public void show() {System.out.println("vit: " + this.vit + ", def: " + this.getDef());}}
-
Memento
:备忘类package com.self.designmode.memento;/*** 备忘录模式: 备忘类* @author PJ_ZHANG* @create 2020-12-17 10:39**/ public class Memento {// 攻击力private int vit;// 防御力private int def;public Memento(int vit, int def) {this.vit = vit;this.def = def;}public Memento(Origination origination) {this.vit = origination.getVit();this.def = origination.getDef();}public int getVit() {return vit;}public void setVit(int vit) {this.vit = vit;}public int getDef() {return def;}public void setDef(int def) {this.def = def;} }
-
Caretakder
:备忘类管理类package com.self.designmode.memento;import java.util.ArrayList; import java.util.List;/*** 备忘录模式:守护者* @author PJ_ZHANG* @create 2020-12-17 10:44**/ public class Caretaker {private List<Memento> lstMemento = new ArrayList<>(10);public void addMemento(Memento memento) {lstMemento.add(memento);}public Memento getMemento(int index) {if (lstMemento.size() <= index) {throw new IndexOutOfBoundsException();}return lstMemento.get(index);}}
-
Client
:客户端package com.self.designmode.memento;/*** 备忘录模式:* @author PJ_ZHANG* @create 2020-12-17 10:51**/ public class Client {public static void main(String[] args) {// 创建原对象Origination origination = new Origination(100, 100);// 生成备忘对象并保存Caretaker caretaker = new Caretaker();caretaker.addMemento(new Memento(origination));System.out.println("初始状态...");origination.show();// 战斗origination.setDef(80);origination.setVit(80);System.out.println("战斗完成状态...");origination.show();// 恢复origination.recoverMemento(caretaker.getMemento(0));System.out.println("恢复初始状态...");origination.show();}}
21.5,备忘录模式的注意事项和细节
- 给用户提供了一种可恢复的机制,可以使用户能够方便的回到上一次操作
- 实现了信息的封装,使用户不需要知道恢复的细节
- 使用场景:游戏存档;Ctrl + Z;浏览器后退;数据库事务管理
- 如果类的数量过度,势必会占用较大的资源,而且每一次保存都会造成一定的内存消耗
- 为了节约内存,备忘录模式可以与原型模式配合使用
这篇关于Java设计模式(21):备忘录模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!