美文网首页
第18章 如果能回到从前--备忘录模式

第18章 如果能回到从前--备忘录模式

作者: 落墨Zero | 来源:发表于2018-07-12 15:03 被阅读0次

备忘录模式

备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。[DP]

备忘录模式(Memento)结构图
图片.png

Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。
Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

基本代码

发起人(Originator)类

public class Originator {

    /**
     * 需要保存的属性,可能有多个
     */
    private String state;

    /**
     * 创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象
     *
     * @return
     */
    public Memento createMemento() {
        return new Memento(state);
    }

    /**
     * 恢复备忘录,将Memento导入并将相关数据恢复
     *
     * @param memento
     */
    public void setMemento(Memento memento) {
        state = memento.getState();
    }

    public void show() {
        print("State=" + state);
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

备忘录类

public class Memento {

    private String state;

    /**
     * 构造方法,将相关数据传入
     * @param state
     */
    public Memento(String state){
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

管理者类

public class Caretaker {

    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

测试代码

public class Test {

    public static void main(String[] args) {
        //Originator初始状态,状态属性为“On”
        Originator originator = new Originator();
        originator.setState("On");
        originator.show();

        //保存状态
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        //修改状态
        originator.setState("Off");
        originator.show();

        //恢复状态
        originator.setMemento(caretaker.getMemento());
        originator.show();
    }

}

把保存细节封装在了Memento中,如果要更改保存的细节也不用影响客户端。
Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。
使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来。[DP]
当角色的状态改变的时候,有可能这个状态无效,就可以使用暂时存储起来的备忘录将状态复原。[DP]

游戏进度备忘

public class Role {

    private int vit = 100;
    private int atk = 100;
    private int def =100;

    public RoleMemento saveState() {
        return new RoleMemento(vit, atk, def);
    }

    public void recoveryState(RoleMemento roleMemento) {
        this.vit = roleMemento.getVit();
        this.atk = roleMemento.getAtk();
        this.def = roleMemento.getDef();
    }

    public void fight(){
        this.vit = 0;
        this.atk = 0;
        this.def = 0;
    }

    public void showState() {
        print("生命力=" + vit);
        print("攻击力=" + atk);
        print("防御力=" + def);
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}


public class RoleMemento {

    private int vit;
    private int atk;
    private int def;

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

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

public class RoleCaretaker {

    private RoleMemento roleMemento;

    public RoleMemento getRoleMemento() {
        return roleMemento;
    }

    public void setRoleMemento(RoleMemento roleMemento) {
        this.roleMemento = roleMemento;
    }
}

测试代码

public class Test {

    public static void main(String[] args) {
        Role role = new Role();
        role.showState();

        RoleCaretaker roleCaretaker = new RoleCaretaker();
        roleCaretaker.setRoleMemento(role.saveState());

        role.fight();
        role.showState();
        
        role.recoveryState(roleCaretaker.getRoleMemento());
        role.showState();
    }

}

相关文章

  • 第18章 如果能回到从前--备忘录模式

    备忘录模式 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状...

  • 如果能回到从前

    好想回到那一天的九点前, 我还可以在人群中默默看着你的笑脸, 还可以像好朋友一样聊天; 遇到难题你总会最快给我答案...

  • 如果能回到从前

    时间,空间组成了我们的世界。我们人类生活在三维空间中,科学家推断还有四维五维直到十一维空间。我们先把空间定...

  • 如果能回到从前

    清明过后春末的一天,在家收拾书柜,无意中翻到一本老版的《鲁迅文集》。 鲁迅先生是我非常喜欢的一位作家,中学时代学过...

  • 如果能回到从前

    “唉!好想能够回到过去啊。如果现在的一切都只是你我之间的一场梦,那该有多好!” “过去?你说的过去...

  • 如果能回到从前

    我经常发表心情,前些年经常在qq发,后期经常在微信发,前一段至今在陌陌发。 工作之余,空闲时间。 由此...

  • 如果能回到从前

    城市的夜晚总是孤独的,身心的疲惫除了生活压力,更多的是不知道去向的茫然。 我们总是在随波逐流,总是好像...

  • 如果能回到从前

    《想见你》最近很火的一部电视剧,讲述了女主人翁无意中穿越回过去的故事!这看似是一部感人至深的穿越剧!其实在讲我们每...

  • 如果能回到从前

    如果能回到从前 我依然选择师范 用我青春的热情点燃 未来人生这里就是起点 如果能回到从前 我依然选择与你相恋 我要...

  • 如果能回到从前

    文/往事如梦 如果回到从前, 我的世界该有多精彩 看日出月落 看云卷云舒 读一首自己写的小诗 听一曲心爱的歌曲 如...

网友评论

      本文标题:第18章 如果能回到从前--备忘录模式

      本文链接:https://www.haomeiwen.com/subject/bptrpftx.html