【浅谈设计模式】(22):备忘录模式 | 代码管理

前言

陆陆续续写了两年的设计模式终于来到最后一篇了,这个系列暂时结束,后面再来总结~

一、概述

何为备忘录设计模式?

备忘录设计模式类似于存档,也称为快照模式,经常我们在发布的时候,会把原来的 jar 程序进行一个备份存档,遇到不对劲的地方就可以恢复操作,备忘录模式就是这个道理。

备忘录模式是一种行为设计模式,用于捕获对象的内部状态,并在不破坏封装性的情况下将其保存,以便将来可以恢复到先前的状态。

在这个设计模式中,需要有一个对象称为备忘录对象来存储对象的状态信息,并提供一种方法恢复对象当前的状态。

备忘备忘,何时使用呢?

当遇到允许用户取消不确定或者错误的操作,能够恢复到他原先的状态的时候,给他一颗后悔药可吃的场景下,就可以使用备忘录模式,当然实际场景下几乎用不上这个设计模式。

备忘录模式主要有如下角色:

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

二、案例

以掘金博客论坛为例,在发表文章的时候,如果点击存入到草稿箱,下次就可以进入草稿箱进行二次编辑,这就相当于一次存档。当然备忘录模式更明显的是 git 备份,每次的操作都会在 git 中记录下时间、修改内容,以便代码可以回滚到任何一个状态。

说明
Commit 备忘录角色,用于保存代码的状态信息
Git 发起人角色,负责创建和代码保存提交
Repository 管理者角色,对代码分支进行管理

在这个示例中,我们模拟了一个简单的Git代码存档系统。Git类负责创建和保存代码提交,Repository类负责保存和管理代码提交的历史记录。通过使用备忘录设计模式,我们可以轻松地保存和恢复代码的状态信息,实现代码存档的功能。

  • Commit
typescript 复制代码
public class Commit {
    private String message;
    private String code;

    public Commit(String message, String code) {
        this.message = message;
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public String getCode() {
        return code;
    }
}
  • Git
typescript 复制代码
public class Git {
    private String currentBranch;
    private String currentCode;
    private List<Commit> commits = new ArrayList<>();

    public void createCommit(String message, String code) {
        currentCode = code;
        commits.add(new Commit(message, code));
    }

    public Commit save() {
        return new Commit("Save point", currentCode);
    }

    public void restore(Commit commit) {
        currentCode = commit.getCode();
    }

    public void display() {
        System.out.println("Current code:");
        System.out.println(currentCode);
    }
}
  • Repository
csharp 复制代码
public class Repository {
    private List<Commit> commits = new ArrayList<>();

    public void addCommit(Commit commit) {
        commits.add(commit);
    }

    public Commit getCommit(int index) {
        return commits.get(index);
    }
}

测试类

java 复制代码
public class Client {
    public static void main(String[] args) {
        Git git = new Git();
        Repository repository = new Repository();

        // 创建提交
git.createCommit("Initial commit", "public class Main { ... }");

        // 保存提交到历史记录
repository.addCommit(git.save());

        // 修改代码
git.createCommit("Add new feature", "public class Main { ... new code ... }");

        // 保存修改后的提交到历史记录
repository.addCommit(git.save());

        // 恢复到先前的状态
git.restore(repository.getCommit(0));

        // 显示恢复后的代码
git.display();
    }
}

输出

kotlin 复制代码
Current code:
public class Main { ... }

三、小结

备忘录设计模式是一种行为设计模式,用于捕获对象的内部状态并在不破坏对象封装性的情况下将其保存,以便将来可以恢复到先前的状态。这种设计模式通常用于需要保存和恢复对象状态的情况,例如撤销操作、历史记录管理等。

优点:

  1. 简化了对象状态的保存和恢复过程,使得代码更加清晰和易于维护。
  2. 可以帮助实现撤销和恢复功能,提高系统的灵活性和可扩展性。
  3. 能够保持对象的封装性,客户端不需要了解对象的具体实现细节。

缺点:

  1. 如果备忘录对象过多或者状态信息过大,可能会消耗大量的内存空间。
  2. 备忘录对象的创建和管理可能会增加系统的复杂性。
  3. 如果备忘录对象的访问权限不当,可能会破坏对象的封装性。

总结:备忘录设计模式是一种非常有用的设计模式,可以帮助我们保存和恢复对象的状态信息,实现撤销和恢复功能。在实际应用中,需要根据具体情况权衡利弊,避免备忘录对象过多或者状态信息过大,以确保系统的性能和可维护性。

相关推荐
utmhikari1 小时前
【架构艺术】Go语言微服务monorepo的代码架构设计
后端·微服务·架构·golang·monorepo
蜡笔小新星1 小时前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
计算机学姐1 小时前
基于Asp.net的驾校管理系统
vue.js·后端·mysql·sqlserver·c#·asp.net·.netcore
欢乐少年19043 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
夏天的味道٥4 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天7 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代7 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n7 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven