美文网首页
备忘录模式(Memento)

备忘录模式(Memento)

作者: jiahzhon | 来源:发表于2020-03-10 17:45 被阅读0次

- 定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

  • 缺点:
    资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

- 主要角色

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

- 结构图

3-1Q119130413927.gif

- 代码实现

package memento;
public class MementoPattern
{
    public static void main(String[] args)
    {
        Originator or=new Originator();
        Caretaker cr=new Caretaker();       
        or.setState("S0"); 
        System.out.println("初始状态:"+or.getState());           
        cr.setMemento(or.createMemento()); //保存状态      
        or.setState("S1"); 
        System.out.println("新的状态:"+or.getState());        
        or.restoreMemento(cr.getMemento()); //恢复状态
        System.out.println("恢复状态:"+or.getState());
    }
}
//备忘录
class Memento
{ 
    private String state; 
    public Memento(String state)
    { 
        this.state=state; 
    }     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
}
//发起人
class Originator
{ 
    private String state;     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
    public Memento createMemento()
    { 
        return new Memento(state); 
    } 
    public void restoreMemento(Memento m)
    { 
        this.setState(m.getState()); 
    } 
}
//管理者
class Caretaker
{ 
    private Memento memento;       
    public void setMemento(Memento m)
    { 
        memento=m; 
    }
    public Memento getMemento()
    { 
        return memento; 
    }
}

例子:游戏步数
第一次前进了10步,第二次前进时踩到便便了,然后要回到之前的进度。例如下图结构:


772743-20180909143948342-775978644.png
  • 游戏类-发起人
/**
 * 游戏
 */
@Data
public class Game {

    /**
     * 玩家走的步数
     */
    private int playerStep;

    /**
     * 备份游戏
     * @return
     */
    public GameMemento createGameMemento(){
        return new GameMemento(playerStep);
    }

    /**
     * 开始玩游戏
     */
    public void play(){
        playerStep = 0;
    }

    /**
     * 恢复备份
     * @param gameMemento
     */
    public void restore(GameMemento gameMemento){
        this.playerStep = gameMemento.getPlayerSteps();
    }
}
  • 备份
/**
 * 备份
 */
@Getter
public class GameMemento {
    /** 步数 */
    private int playerSteps;

    /**
     * 备份步数
     * @param playerSteps
     */
    public GameMemento(int playerSteps){
        this.playerSteps = playerSteps;
    }

}
  • 备份信息管理类
/**
 * 备份信息管理类
 */
public class Caretaker {
    /** 备份 */
    private GameMemento gameMemento;
    /** 恢复备份 */
    public GameMemento retrieveMemento(){
        return this.gameMemento;
    }
    /** 保存备份 */
    public void saveMemento(GameMemento gameMemento){
        this.gameMemento = gameMemento;
    }
}
  • 测试
public class Player {

    public static void main(String[] args) {

        Game game = new Game();
        System.out.println("游戏开始,捡到滑板,前进10步");
        game.setPlayerStep(10);
        //备份当前状态
        System.out.println("备份当前状态");
        GameMemento gameMemento = game.createGameMemento();

        Caretaker caretaker = new Caretaker();

        caretaker.saveMemento(gameMemento);
        System.out.println("备份完成");
        game.play();
        System.out.println("踩到便便了,当前步数为:"+game.getPlayerStep());
        System.out.println("还原到之前一步");
        game.restore(caretaker.retrieveMemento());

        System.out.println("恢复完成,当前玩家步数是:"+game.getPlayerStep());

    }

}

打印结果:

游戏开始,捡到滑板,前进10步
备份当前状态
备份完成
踩到便便了,当前步数为:0
还原到之前一步
恢复完成,当前玩家步数是:10

相关文章

网友评论

      本文标题:备忘录模式(Memento)

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