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


    🚀简介

    备忘录模式(Memento Pattern)是一种行为型设计模式,它保存一个对象的某个状态,以便在适当的时候恢复对象。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样我们就可以在需要的时候将该对象恢复到原先保存的状态 。

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

    🚀案例

    🐤发起人(Originator)角色

    首先,我们创建一个Originator类,它有一个内部状态State和一个Memento对象来保存状态。

    1. public class Originator
    2. {
    3. private string _state;
    4. public void Set(string state)
    5. {
    6. _state = state;
    7. }
    8. public Memento SaveToMemento()
    9. {
    10. return new Memento(_state);
    11. }
    12. public void GetFromMemento(Memento memento)
    13. {
    14. _state = memento.GetState();
    15. }
    16. public string GetState()
    17. {
    18. return _state;
    19. }
    20. }

    🐤备忘录(Memento)角色

    然后,我们创建一个Memento类,它包含一个内部状态State

    1. public class Memento
    2. {
    3. private readonly string _state;
    4. public Memento(string state)
    5. {
    6. _state = state;
    7. }
    8. public string GetState()
    9. {
    10. return _state;
    11. }
    12. }

    🐤管理者(Caretaker)角色

    接下来,我们创建一个Caretaker类,它负责保存和获取Memento对象。

    1. public class Caretaker
    2. {
    3. private readonly Stack _mementoStack = new Stack();
    4. public void Add(Memento state)
    5. {
    6. _mementoStack.Push(state);
    7. }
    8. public Memento Get()
    9. {
    10. return _mementoStack.Pop();
    11. }
    12. }

    🐳测试类

    1. class MyClass
    2. {
    3. public static void Main(string[] args)
    4. {
    5. Originator originator = new Originator();
    6. Caretaker caretaker = new Caretaker();
    7. originator.Set("State #1");
    8. caretaker.Add(originator.SaveToMemento());
    9. originator.Set("State #2");
    10. caretaker.Add(originator.SaveToMemento());
    11. originator.Set("State #3");
    12. caretaker.Add(originator.SaveToMemento());
    13. originator.GetFromMemento(caretaker.Get());
    14. Console.WriteLine("Current State: " + originator.GetState());
    15. originator.GetFromMemento(caretaker.Get());
    16. Console.WriteLine("Current State: " + originator.GetState());
    17. }
    18. }

    👻运行结果!

    🚀优缺点

    优点:
    1. 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
    2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
    3. 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
    缺点:
    • 资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
    使用场景:
    • 需要保存与恢复数据的场景,如玩游戏时的中间结果的存档功能。
    • 需要提供一个可回滚操作的场景,如 Word、记事本、Photoshopidea等软件在编辑时按Ctrl+Z 组合键,还有数据库中事务操作。
  • 相关阅读:
    react 修改less文件后保存,内存溢出,项目崩溃问题解决
    java111-日期时间格式化
    问题:vue2+elementui,tabs切换显示表格并设置表格选中行高亮失败
    golang数据结构与算法——递归、迷宫回溯和二叉树的遍历
    3D模型格式汇总
    Bootstrap 自定义Tooltips背景色样式等
    Java_代码块
    元宇宙iwemeta:风口上的脑机接口,偷偷的解密大脑
    基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)
    DTD和XSD的区别
  • 原文地址:https://blog.csdn.net/weixin_65243968/article/details/133849464