X.d 笔记

小Web,大世界

0%

设计模式(18):备忘录模式 Memento

说的通俗点,就是备份,与一键GOHST备份不同,备忘录模式只备份数据,不备份程序本身哦~

备忘录模式 Memento

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

问题:

Need to restore an object back to its previous state (e.g. “undo” or “rollback” operations).

意图:

  • Without violating encapsulation, capture and externalize an object’s internal state so that the object can be returned to this state later.
  • A magic cookie that encapsulates a “check point” capability.
  • Promote undo or rollback to full object status.

代码

例:从介绍上来看,很好理解,创建一个快照对象(不是搜索引擎的那种啊),当后面有操作失误时可以undo或者rollback.比如SQL一般运行时都会每天自动备份一次或多次,如果数据出了问题都可以回去的,还有就是玩游戏的存档,就是一个典型的备忘录模式,想休息时先存个档~~

代码1:需要存档的游戏数据

import java.util.ArrayList;
import java.util.List;
//假设我玩游戏只有血量和经验两个数据保存
public class Record {
    public int hp;
    public int exp;
    public int getHp() {
        return hp;
    }
    public void setHp(int hp) {
        this.hp = hp;
    }
    public int getExp() {
        return exp;
    }
    public void setExp(int exp) {
        this.exp = exp;
    }
}

代码2:存档管理器

/**
 * @author xdnote.com
 * 存档管理器
 * */
public class RecordManager {
    private static List<Record> records =new ArrayList<Record>();
    //存档,一般当然是存文件而不是内存啦
    public static void saveRecord(Record record){
        records.add(record);
    }
    //恢复最近的存档
    public static Record storeRecentRecord(){
        return records.get(records.size()-1);
    }
}

代码3:客户端调用

public static void main(String[] args){
    Record record = new Record();
    record.setHp(500);
    record.setExp(9800);
    RecordManager.saveRecord(record);

    //又完了一会,人物变强了,可但蛋疼的停电了
    Record recentRecord = RecordManager.storeRecentRecord();
    System.out.println(recentRecord.getExp());

}

小结

备忘录模式 Memento

  • 使用频率:
    除非业务上有 Ctrl + ZCtrl + Y这样的功能,不然一般不会使用。

  • 利弊影响:
    哦,其实这个写成API后还是很好用,但就怕元数据有变化啊。