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

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

备忘录(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();
    }
}

运行截图如下:

相关推荐
YYYing.38 分钟前
【设计模式系列 (八) 】组合模式
c++·后端·设计模式·组合模式·c/c++
geovindu15 小时前
rust: Composite Pattern
开发语言·后端·设计模式·rust·组合模式
YYYing.19 小时前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式
阿狗童鞋2 天前
设计模式实战指南
设计模式
电子科技圈2 天前
基于车载SerDes和OpenGMSL协议的SoC设计与验证:行业高频问题解析
设计模式·车载系统·软件构建·设计规范
ClinicTech2 天前
高速冷冻离心机的温控系统与安全保护逻辑解析
设计模式·架构·健康医疗·设计语言
GISMagic2 天前
3.《设计模式》:软件设计与解耦能力提炼
设计模式·ai coding
染指11102 天前
131.Agent-Agent设计模式-MAS多智能体系统(Multi-Agent-System)
人工智能·设计模式·langchain·agent·agents
ShyanZh3 天前
【Python3基础】13-Python 常用设计模式
开发语言·python·设计模式
YYYing.3 天前
【设计模式系列 (五) 】原型模式
开发语言·后端·设计模式·原型模式·c/c++