设计模式(十二):备忘录模式
来源:互联网 发布:网络推广信息方案 编辑:程序博客网 时间:2024/06/04 19:19
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
(1):Originator:负责实例化一个备忘录Memento类,记录当前时刻它的内部状态,作为备份。
(2):Memento:备忘录类,Originator的状态备份
(3)Caretaker:管理者类,管理备忘录类,通过caretaker对备忘录设置和访问
例子:
玩仙剑的时候,每次大战boss之前,一般都会有一个存档的地方保存游戏的当前进度,如果大战boss失败,可以读取存档重新来过,存档就相当于备忘录。
1、Originator类,游戏角色
(1)属性:包含生命力,防御力、攻击力三个属性,初始化值都为100
(2)方法:saveState()方法,保存当前的状态,并返回一个备忘录类,相当于游戏中的存档
recoverState(Memento),恢复状态方法,需要传入一个备忘录类,从备忘录中恢复状态
show()方法,显示当前状态
attack()方法
/** * Originator类 */public class GameRole { private int vitality;//生命力 private int attack;//攻击力 private int defense;//防御力 //初始化 public GameRole() { this.vitality=100; this.attack=100; this.defense=100; } public void show(){ System.out.println("生命力:"+vitality); System.out.println("攻击力:"+attack); System.out.println("防御力:"+defense); } /** * 保存状态 * @return */ public RoleStateMemento saveState(){ //返回一个备忘录类,用来保存当前状态 return new RoleStateMemento(this.vitality,this.attack,this.defense); } /** * 恢复状态 * @param roleStateMemento */ public void recoveryState(RoleStateMemento roleStateMemento){ this.vitality=roleStateMemento.getVitality(); this.defense=roleStateMemento.getDefense(); this.attack=roleStateMemento.getAttack(); } /** * 战斗 */ public void fight(){ this.vitality=0; this.attack=0; this.defense=0; } public int getVitality() { return vitality; } public void setVitality(int vitality) { this.vitality = vitality; } public int getAttack() { return attack; } public void setAttack(int attack) { this.attack = attack; } public int getDefense() { return defense; } public void setDefense(int defense) { this.defense = defense; }}
2、备忘录类,用来保存Originator的状态
/** * Memento备忘录类 */public class RoleStateMemento { private int vitality;//生命力 private int attack;//攻击力 private int defense;//防御力 public RoleStateMemento(int vitality, int attack, int defense) { this.vitality = vitality; this.attack = attack; this.defense = defense; } public int getVitality() { return vitality; } public void setVitality(int vitality) { this.vitality = vitality; } public int getAttack() { return attack; } public void setAttack(int attack) { this.attack = attack; } public int getDefense() { return defense; } public void setDefense(int defense) { this.defense = defense; }}
3、管理者类
包含一个对备忘录类的引用,负责设置和访问备忘录类
/** * Caretaker管理者类 */public class RoleStateCaretaker { private RoleStateMemento memento; public RoleStateMemento getMemento() { return memento; } public void setMemento(RoleStateMemento memento) { this.memento = memento; }}
public class Test { public static void main(String[] args) { //创建游戏角色李逍遥 GameRole lixiaoyao=new GameRole(); System.out.println("战斗前:"); lixiaoyao.show(); //保存进度,创建一个管理者 RoleStateCaretaker roleStateCaretaker=new RoleStateCaretaker(); roleStateCaretaker.setMemento(lixiaoyao.saveState());//由管理者管理备忘录类 //战斗 lixiaoyao.fight(); System.out.println("战斗后:"); lixiaoyao.show(); //恢复进度 lixiaoyao.recoveryState(roleStateCaretaker.getMemento()); System.out.println("恢复:"); lixiaoyao.show(); }}
输出:
战斗前:生命力:100攻击力:100防御力:100战斗后:生命力:0攻击力:0防御力:0恢复:生命力:100攻击力:100防御力:100
来自:大话设计模式
阅读全文
0 0
- 十二、备忘录设计模式
- Android设计模式(十二)-备忘录模式
- 设计模式(十二):备忘录模式
- Java设计模式之二十二(备忘录模式)
- [设计模式](十二):备忘录模式(Memento)|状态模式(State)
- 十二、备忘录模式
- 设计模式-----备忘录模式
- 设计模式 备忘录模式
- 【设计模式】备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 【设计模式】备忘录模式
- 设计模式-备忘录模式
- 设计模式--备忘录模式
- LightOJ1248---Dice (III) (概率问题)
- $stateParams传值 undefined原因
- Java学习之Iterator(迭代器)的一般用法 (转)
- [LYOI25]素数路
- Django一(安装&入门)
- 设计模式(十二):备忘录模式
- 宏基因组拼接方法
- MySQL中varchar类型转int
- C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp区别与联系
- linux 设置ftp服务器
- Firefox v54.0 稳定版
- 单链表元素的插入
- MySql ERROR_CODE:23000
- bzoj 3168: [Heoi2013]钙铁锌硒维生素 矩阵求逆+构造最小字典序完备匹配