/** * 备忘录模式 * * 1、源发器类(具体的业务类/需要备份的类) * 2、备忘录类(拷贝类,用于恢复) * 3、负责人类(管理所有的拷贝) * * 将对象在某个时间点信息保存起来,方便以后查看 * * 优点: * 1、具体的备份过程交给实体类,保持了封装性 * 2、备份保存在实体类以外(负责人类),实现了单一职能 * 缺点: * 1、一般的备份都是多备份,所以对资源的消耗还是很大的 * * 场景: * 游戏存盘读盘、文档编辑撤销、JDBC回滚 */ public class MementoDemo01 { public static void main(String[] args) { SaveManager sm = new SaveManager(); Player p = new Player("李逍遥"); p.setPlace("余杭镇盛渔村"); System.out.println("初始化:"); System.out.println(p); sm.add(p.memento()); p.setPlace("仙灵岛"); p.setLevel(3); p.setMoney(500); System.out.println("存储点1:"); System.out.println(p); sm.add(p.memento()); p.setPlace("苏州城外"); p.setLevel(15); p.setMoney(1100); System.out.println("存储点2:"); System.out.println(p); sm.add(p.memento()); System.out.println(); System.out.println("获取初始化:"); p.recovery(sm.get(0)); System.out.println(p); System.out.println("获取存储点1:"); p.recovery(sm.get(1)); System.out.println(p); System.out.println("获取存储点2:"); p.recovery(sm.get(2)); System.out.println(p); } } /** * 源发器类(需要备份历史记录的类) */ class Player{ private String name; private int level=1; private int money=0; private String place; public Save memento(){//进行备份 return new Save(this); } public void recovery(Save s){//还原备份 this.name = s.getName(); this.level = s.getLevel(); this.money = s.getMoney(); this.place = s.getPlace(); } public Player(String name){ this.name = name; } public String getName(){ return this.name; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public String getPlace() { return place; } public void setPlace(String place) { this.place = place; } @Override public String toString() { return "["+this.name+"][等级:"+this.level+" 钱:"+this.money+" 地点:"+this.place+"]"; } } /** * 备忘录类(需要保存对象的拷贝) */ class Save{ private String name; private int level=1; private int money=0; private String place; public Save(Player p) { this.name = p.getName(); this.level = p.getLevel(); this.money = p.getMoney(); this.place = p.getPlace(); } public String getName() { return name; } public int getLevel() { return level; } public int getMoney() { return money; } public String getPlace(){ return this.place; } } /** * 负责人类(管理拷贝) */ class SaveManager{ List<Save> list = new ArrayList<Save>(); public void add(Save s){ list.add(s); } public Save get(int i){ return list.get(i); } }
输出结果:
初始化: [李逍遥][等级:1 钱:0 地点:余杭镇盛渔村] 存储点1: [李逍遥][等级:3 钱:500 地点:仙灵岛] 存储点2: [李逍遥][等级:15 钱:1100 地点:苏州城外] 获取初始化: [李逍遥][等级:1 钱:0 地点:余杭镇盛渔村] 获取存储点1: [李逍遥][等级:3 钱:500 地点:仙灵岛] 获取存储点2: [李逍遥][等级:15 钱:1100 地点:苏州城外]