6月更文挑战|设计模式 —— 备忘录模式

198 阅读3分钟

这是我参与更文挑战的第13天,活动详情查看:更文挑战

备忘录模式

备忘录模式是一种行为模式,用于保存对象当前状态,在之后可以重新恢复到当时状态。实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护被保存的这些对象状态的完整性以及内部实现不向外暴露。

实战

备忘录模式最常见的场景就是游戏存档了,当开始启动玩游戏之后在关闭游戏的时候需要记录下当前游戏状态,比如游戏时间,用户等级,游戏坐标等。当游戏下次启动的时候可以知道游戏玩家当前等级,在哪游戏的位置等信息。

创建一个GameArchive类用于保存需要保存的游戏信息;ComputerGame是游戏类拥有各种游戏数据信息参数,在游戏过程中随时修改信息参数;ArchiveMaker是游戏存档保存类,主要功能是暂存和获取GameArchive。当游戏开始进行到一定时间后在做退出游戏操作前将GameArchive保存到ArchiveMaker,之后重启游戏后从ArchiveMaker获取之前的游戏存档GameArchive恢复到ComputerGame。

class ComputerGame{
    private int time;
    private int level;
    private String userName;
    
    
    public void play(){
        time += 1;
        level += 1;
    }
    
    public void quit(){}
    
    
    public void setNickName(String name){
        this.name = name;
    }
    
    public GameArchive getGameArchive(){
        GameArchive gameArchive = new GameArchive();
        gameArchive.time = this.time;
        gameArchive.level = this.level;
        gameArchive.userName = this.userName;
        return gameArchive;
    }
    
    public void setGameArchive(GameArchive archive){
        this.time = archive.time;
        this.level = archive.level;
        this.userName = archive.userName;
    }

}

class GameArchive{
    public int time;
    public int level;
    public String userName;
}

class ArchiveMaker{
    GameArchive gameArchive;
    
    public void setGameArchive(GameArchive archive){
        this.gameArchive = archive;
    }
    
    public GameArchive getGameArchive(){
        return archive;
    }
    
}
ArchiveMaker archiveMaker = new ArchiveMaker();

ComputerGame computerGame = new ComputerGame();
computerGame.play();
computerGame.setNickName("same");

archiveMaker.setGameArchive(computerGame.getGameArchive());

computerGame.quit();

ComputerGame newComputerGame = new ComputerGame();
newComputerGame.setGameArchive(archiveMaker.getGameArchive());
newComputerGame.play();

Android中的onSaveInstanceState

在Android开发中有onSaveInstanceState和onRestoreInstanceState这两个方法用来保存一些信息并在下次返回Activity时恢复这些数据。当Activity不是正常方式退出,且Activity在随后的时间内被系统杀死之前会调用这两个方法让开发人员可以有机会存储Activity相关信息,且在下次返回Activity时恢复这些数据。

  • onCreate(Bundle savedInstanceState) 入参是savedInstanceState,表示的是在onSaveInstanceState或者 onRestoreInstanceState中保存的数据。
  • onSaveInstanceState(Bundle outState) Activity声明周期结束会将要保存的数据保存在Bundle中。一般用户主动销毁Activity是不会调用保存,该方法一定是在onStop方法之前调用。
  • onRestoreInstanceState(Bundle savedInstanceState) 在Activity被系统销毁之后恢复 Activity时被调用,只有销毁了之后重建的时候才调用。正常情况下是不会调用改方法。

总结

备忘录模式在不破坏封装的情况下,通过备忘录对象存储内部状态快照,在未来某一时刻将对象重新恢复之前状态。

备忘录模式优点:为用户提供了恢复状态机制,可以使用户比较方便恢复到历史状态,并实现信息封装,对外不需要关心状态保存情况。

备忘录模式缺点:资源消耗,类成员会变得过多将占用比较大的资源,相当于拷贝另存一份状态对象。