23.Memento——备忘录模式

demo描述:给游戏角色做一个备忘,以便恢复角色满血状态
 

demo代码:

备忘录管理者,根据实际情况选择备忘录类型:

public class Caretaker {
    //一个角色只保存一次状态用它
    private Memento memento;
    //一个角色保存多个状态用它
    // private ArrayList mementos;
    //多个角色保存多个状态用它
    // private HashMap> rolesMementos;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

备忘录,存备忘对象的属性,而不是存备忘录:

public class Memento {
    private int vit;
    private int def;

    public Memento(int vit, int def) {
        this.vit = vit;
        this.def = def;
    }


    public int getVit() {return vit;}
    public void setVit(int vit) {this.vit = vit;}
    public int getDef() {return def;}
    public void setDef(int def) {this.def = def;}
}

游戏角色,被备忘者:

public class GameRole {
    private int vit;
    private int def;

    //显示当前游戏角色的状态
    public void display(){
        System.out.println("游戏角色当前攻击力:"+this.vit);
        System.out.println("游戏角色当前防御力:"+this.def);
    }

    //存:创建Memento,将当前属性值存入备忘录
    public Memento createMemento(){
        return new Memento(vit,def);
    }

    //取:从备忘录对象读取备忘的属性,恢复GameRole的状态
    public void recoverGameRoleFromMemento(Memento memento){
        this.vit=memento.getVit();
        this.def=memento.getDef();
    }
    

    public int getVit() {return vit;}
    public void setVit(int vit) {this.vit = vit;}
    public int getDef() {return def;}
    public void setDef(int def) {this.def = def;}
}

客户端:

public class Client {
    public static void main(String[] args) {
        //创建游戏角色
        GameRole gameRole = new GameRole();
        gameRole.setVit(100);
        gameRole.setDef(100);
        System.out.println("和boss大战前的状态");
        gameRole.display();

        //保存当前状态
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(gameRole.createMemento());

        System.out.println("和boss大战。。。");
        gameRole.setVit(30);
        gameRole.setDef(30);
        gameRole.display();

        System.out.println("大战后用备忘录恢复到战前");
        gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
        gameRole.display();
    }
}

 

demo类图:

23.Memento——备忘录模式_第1张图片

类图分析:备忘录模式比较简单,备忘录管理者负责用什么类型的备忘录保存备忘对象;备忘录负责保存备忘对象的属性状态,其属性与备忘对象要备份的属性一致;备忘对象需要向备忘录里set要备忘的状态和get备忘状态以恢复初始状态

 

适用场景:一个对象需要及时恢复初始化状态或快速回到某一状态时使用;

 

总结:备忘录模式在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,方便该对象恢复这个状态;如果类的成员变量过多会占用较大的资源,每次保存都会消耗一定的内存,为了节约内存可和原型模式配合。

你可能感兴趣的:(java设计模式)