博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.16(设计模式)备忘录模式
阅读量:7283 次
发布时间:2019-06-30

本文共 3704 字,大约阅读时间需要 12 分钟。

备忘录模式,在不破坏对象封装的情况下,获取对象状态并将其保存下来。

比如游戏关卡的存档。

 

 

 

游戏状态类

通过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
mementosMap = new HashMap
(); 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.cnblogs.com/huang-changfan/p/11010899.html

你可能感兴趣的文章
Rearrange a string so that all same characters become d distance away
查看>>
Python之路(第二十六篇) 面向对象进阶:内置方法
查看>>
追梦路上
查看>>
Centos7 gvim sougou搜狗输入法无法切换
查看>>
Dynamics CRM 报表导出EXCEL 列合并问题的解决方法
查看>>
MTK6573的LDO控制
查看>>
【工具】-RAP接口管理工具
查看>>
***单文件搞定微信支付和支付宝支付
查看>>
Adminimize 插件:WordPress根据用户角色显示/隐藏某些后台功能
查看>>
运维老鸟教你安装centos6.5如何选择安装包
查看>>
Entity Framework Code-First(13):Configure Many-to-Many
查看>>
Hash的应用
查看>>
如何解决缺少OCX问题,如何在win7 64位下注册OCX
查看>>
《程序员代码面试指南》第五章 字符串问题 将整数字符串转成整数值
查看>>
python模拟登录人人网
查看>>
SSM整合过程中出现的问题
查看>>
37、如何在函数中设置一个全局变量 ?
查看>>
java 类加载机制总结
查看>>
HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)
查看>>
62. Unique Paths不同路径
查看>>