设计模式之-备忘录模式,快速掌握备忘录模式,通俗易懂的讲解备忘录模式以及它的使用场景

文章目录


一、快速理解备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和存储对象的内部状态,并在需要时进行恢复。它将对象的状态封装在备忘录对象中,以便在需要时可以还原到之前的状态。

二、备忘录模式使用场景

  1. 需要保存和恢复对象的内部状态,以便在后续操作中使用。
  2. 需要在不破坏对象封装性的前提下,获取对象的状态快照。
  3. 需要提供撤销操作的功能。

三、代码示例

以下是一个简单的示例,通过备忘录模式实现了一个文本编辑器的撤销功能。

bash 复制代码
// 备忘录类 - 保存文本编辑器的状态
class EditorMemento {
    private String content;

    public EditorMemento(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

// 原发器类 - 文本编辑器
class TextEditor {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public EditorMemento save() {
        return new EditorMemento(content);
    }

    public void restore(EditorMemento memento) {
        content = memento.getContent();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();

        editor.setContent("Hello, World!"); // 设置初始内容
        System.out.println("初始内容: " + editor.getContent());

        EditorMemento memento = editor.save(); // 保存状态

        editor.setContent("Hello, OpenAI!"); // 修改内容
        System.out.println("修改后的内容: " + editor.getContent());

        editor.restore(memento); // 恢复到之前的状态
        System.out.println("恢复后的内容: " + editor.getContent());
    }
}

在上述代码中,我们定义了备忘录类 EditorMemento,用于保存文本编辑器 TextEditor 的状态。TextEditor 类提供了设置内容、获取内容、保存状态和恢复状态的方法。客户端代码演示了文本编辑器的使用,包括修改内容、保存状态、恢复状态等操作。

四、我们再来听一个故事,加深一下理解

故事背景:

假设你是一位玩家,正在玩一款角色扮演游戏。在游戏中,你的角色可以通过完成任务和战斗来提升等级、获得物品和装备。然而,你发现游戏没有提供保存进度的功能,一旦退出游戏,你的角色的进展将会丢失。你希望能够保存游戏进度,以便在需要时可以恢复到之前的状态。

备忘录模式的应用:

你决定使用备忘录模式来实现游戏存档功能。你创建了一个游戏存档管理器类(Caretaker),它负责存储和管理游戏的备忘录对象(Memento)。每当你想保存游戏进度时,你会创建一个备忘录对象,将当前角色的状态(等级、经验、装备等)保存在备忘录中,并将备忘录对象交给存档管理器保存。当你想恢复游戏进度时,你可以向存档管理器请求获取最新的备忘录对象,并从中恢复角色的状态。

这样,你就可以在玩游戏时随时保存进度,并在需要时恢复到之前的状态。无论是因为意外退出游戏、尝试不同的策略还是回顾过去的成就,备忘录模式为你提供了一种可靠的方式来保存和恢复游戏进度。

在这个故事中,备忘录模式充当了游戏存档的功能。它通过创建备忘录对象来捕获和保存游戏角色的状态,而存档管理器类则负责管理这些备忘录对象。这样,你可以随时保存和恢复游戏进度,享受游戏的乐趣。

下是一个简单的Java代码示例,演示了如何使用备忘录模式实现游戏存档功能:

bash 复制代码
// 备忘录类 - 存储游戏角色的状态
class GameMemento {
    private int level;
    private int experience;
    private String equipment;

    public GameMemento(int level, int experience, String equipment) {
        this.level = level;
        this.experience = experience;
        this.equipment = equipment;
    }

    public int getLevel() {
        return level;
    }

    public int getExperience() {
        return experience;
    }

    public String getEquipment() {
        return equipment;
    }
}

// 原发器类 - 游戏角色
class GameCharacter {
    private int level;
    private int experience;
    private String equipment;

    public void setLevel(int level) {
        this.level = level;
    }

    public void setExperience(int experience) {
        this.experience = experience;
    }

    public void setEquipment(String equipment) {
        this.equipment = equipment;
    }

    public GameMemento save() {
        return new GameMemento(level, experience, equipment);
    }

    public void restore(GameMemento memento) {
        level = memento.getLevel();
        experience = memento.getExperience();
        equipment = memento.getEquipment();
    }

    public void displayStatus() {
        System.out.println("Level: " + level);
        System.out.println("Experience: " + experience);
        System.out.println("Equipment: " + equipment);
    }
}

// 存档管理器类 - 管理游戏的备忘录
class GameSaveManager {
    private GameMemento memento;

    public void saveGame(GameMemento memento) {
        this.memento = memento;
    }

    public GameMemento loadGame() {
        return memento;
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        GameCharacter character = new GameCharacter();
        GameSaveManager saveManager = new GameSaveManager();

        // 初始状态
        character.setLevel(1);
        character.setExperience(0);
        character.setEquipment("Wooden Sword");
        character.displayStatus();

        // 保存游戏进度
        GameMemento memento = character.save();
        saveManager.saveGame(memento);

        // 模拟游戏进展
        character.setLevel(5);
        character.setExperience(1000);
        character.setEquipment("Legendary Sword");
        character.displayStatus();

        // 恢复游戏进度
        GameMemento savedMemento = saveManager.loadGame();
        character.restore(savedMemento);
        character.displayStatus();
    }
}

在上述代码中,我们定义了备忘录类 GameMemento,用于保存游戏角色的状态。游戏角色类 GameCharacter 具有设置状态、保存状态和恢复状态的方法,并且可以显示当前状态。存档管理器类 GameSaveManager 负责保存和加载游戏的备忘录对象。

在客户端代码中,我们创建了游戏角色实例和存档管理器实例。首先,我们设置游戏角色的初始状态,并显示状态信息。然后,我们使用备忘录模式保存当前状态并存储在存档管理器中。接下来,我们模拟游戏的进展,修改游戏角色的状态,并显示新的状态信息。最后,我们从存档管理器中加载备忘录对象,恢复游戏角色的状态,并再次显示状态信息。

通过运行以上代码,你将看到游戏角色的状态在保存和恢复过程中得到正确的处理,实现了游戏存档的功能。

五、备忘录模式的优缺点

优点

  • 对象的状态可以被保存和恢复,提供了一种灵活的方式来处理状态的变化。
  • 备忘录对象与原发器对象相互独立,封装了对象的状态,保证了封装性和信息隐藏。
  • 可以轻松实现撤销操作,使得系统具有可逆性。

缺点

  • 如果要保存的状态较大或频繁保存状态,会消耗较多的内存。
  • 在使用备忘录模式时,需要权衡备忘录对象的创建和管理成本。

总结

备忘录模式的核心思想是通过备忘录对象来存储和恢复对象的状态,以实现状态的保存和恢复功能。它的应用场景包括各种需要保存和恢复状态的情况,比如编辑器的撤销功能、游戏中的存档功能等。通过备忘录模式,我们可以在不破坏封装性的前提下,轻松实现对象状态的保存和恢复。

相关推荐
闲人一枚(学习中)2 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白9504 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白9505 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in6 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in6 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)6 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep6 小时前
干掉 if else 之策略模式
后端·设计模式
哪 吒14 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_102214 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神17 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式