目录
Memento 备忘录模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
1.2. 自我理解
当你需要让对象返回之前的状态时(例如,你的用户请求“撤销”),就是用备忘录模式。
备忘录模式有两个目标:
1、存储系统关键对象的重要状态。
2、维护关键对象的封装。
优点:
1、将被存储的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。
2、保持关键对象的数据封装。
3、提供了容易实现的恢复能力。
缺点:
1、存储和恢复状态的过程可能相当耗时。
2、消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
1.3. 备忘录模式的组成
Memento:包含了要被恢复的对象的状态。
Originator:创建并在 Memento 对象中存储状态。
Caretaker:负责从 Memento 中恢复对象的状态。
2. UML
3. Example
3.1. 场景
游戏通关,中间存档功能,闯关失败,还可以从存档中恢复。
3.2. 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
/** * Created * Date: 2021/07/15 16:41 <br/> * Description: 备忘录模式 * * @author zhaomin@edata.com.cn * @see */ public class MementoPatternDemo { public static void main(String[] args) { Originator originator = new Originator(); CareTaker careTaker = new CareTaker(); originator.setState("State #1"); originator.setState("State #2"); careTaker.add(originator.saveStateToMemento()); originator.setState("State #3"); careTaker.add(originator.saveStateToMemento()); originator.setState("State #4"); System.out.println("Current State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("First saved State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State: " + originator.getState()); } public static class Memento{ private String state; public Memento(String state){ this.state = state; } public String getState() { return state; } } public static class Originator{ private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public Memento saveStateToMemento(){ return new Memento(state); } public void getStateFromMemento(Memento memento){ state = memento.getState(); } } public static class CareTaker { private List<Memento> mementoList = new ArrayList<Memento>(); public void add(Memento memento){ mementoList.add(memento); } public Memento get(int index){ return mementoList.get(index); } } } |
4. 参考资料
https://www.runoob.com/design-pattern/memento-pattern.html
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/memento-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。