设计模式—行为型模式之备忘录模式

设计模式---行为型模式之备忘录模式

备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。这是一种对象行为型模式。

有如下角色:

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

示例

比如我们有一个奥特曼游戏,每一个奥特曼有血量,等级,我们可以建一个游戏备份来保存这些有用的内容,并使用游戏服务器管理他们。

奥特曼类如下:

java 复制代码
@Data
public class Ultraman {
    private Integer hp;//血量
    private Integer level;//等级

    //备忘录管理者
    private GameServer gameServer = new GameServer();

    /**
     * 进行游戏
     */
    public void play(){
        hp = level = new Random().nextInt();
    }

    /**
     * 保存备忘录
     */
    public void saveRocord() throws Exception {
        System.out.println("保存备忘录");
        gameServer.addRecord(this);
    }

    /**
     * 获取备忘录
     */
    public Ultraman restoreRecord(Integer id) throws Exception {
        System.out.println("获取记录");
        return gameServer.getRecord(id);
    }

    public void exit() throws Exception {
        System.out.println("退出并存档");
        gameServer.addRecord(this);
    }
}

记录类如下:

java 复制代码
/**
 * 游戏备份----备忘录
 */
@Data
public class GameRocord {
    private Integer id;//备忘录id
    private Integer hp;//血量
    private Integer level;//等级
}

游戏服务器类如下:

java 复制代码
/**
 * 游戏服务器------备忘录管理者
 */
public class GameServer {
    //记录id
    private Integer i = 1;
    //备忘录管理
    private Map<Integer,GameRocord> recordMap = new HashMap<>();

    /**
     * 添加备忘录
     */
    public void addRecord(Ultraman ultraman) throws Exception {
        GameRocord gameRocord = new GameRocord();
        BeanUtils.copyProperties(gameRocord,ultraman);
        gameRocord.setId(i++);
        recordMap.put(gameRocord.getId(),gameRocord);
    }

    /**
     * 恢复备忘录
     */
    public Ultraman getRecord(Integer id) throws Exception{
        GameRocord gameRocord = recordMap.get(id);
        Ultraman ultraman = new Ultraman();
        BeanUtils.copyProperties(ultraman,gameRocord);
        return ultraman;
    }

}

测试类如下:

java 复制代码
public class MementoTest {
    public static void main(String[] args) throws Exception {
        Ultraman ultraman = new Ultraman();
        //进行游戏
        ultraman.play();
        //存档
        ultraman.saveRocord();
        ultraman.setHp(1);
        ultraman.saveRocord();
        Ultraman ultramanRecord = ultraman.restoreRecord(1);
        ultraman.exit();
    }
}

运行截图如下:

相关推荐
晨米酱3 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机8 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机9 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤9 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤1 天前
工厂模式
设计模式