当前位置: 首页 > news >正文

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

🚀简介

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

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

🚀案例

🐤发起人(Originator)角色

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

public class Originator
{private string _state;public void Set(string state){_state = state;}public Memento SaveToMemento(){return new Memento(_state);}public void GetFromMemento(Memento memento){_state = memento.GetState();}public string GetState(){return _state;}
}

🐤备忘录(Memento)角色

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

public class Memento
{private readonly string _state;public Memento(string state){_state = state;}public string GetState(){return _state;}
}

🐤管理者(Caretaker)角色

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

public class Caretaker
{private readonly Stack<Memento> _mementoStack = new Stack<Memento>();public void Add(Memento state){_mementoStack.Push(state);}public Memento Get(){return _mementoStack.Pop();}
}

🐳测试类

class MyClass
{public static void Main(string[] args){Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.Set("State #1");caretaker.Add(originator.SaveToMemento());originator.Set("State #2");caretaker.Add(originator.SaveToMemento());originator.Set("State #3");caretaker.Add(originator.SaveToMemento());originator.GetFromMemento(caretaker.Get());Console.WriteLine("Current State: " + originator.GetState());originator.GetFromMemento(caretaker.Get());Console.WriteLine("Current State: " + originator.GetState());}
}

👻运行结果!

🚀优缺点

优点:
  1. 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  3. 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
缺点:
  • 资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
使用场景:
  • 需要保存与恢复数据的场景,如玩游戏时的中间结果的存档功能。
  • 需要提供一个可回滚操作的场景,如 Word、记事本、Photoshopidea等软件在编辑时按Ctrl+Z 组合键,还有数据库中事务操作。
http://www.lryc.cn/news/195585.html

相关文章:

  • ffmpeg+安卓+yolo+RK3399部署
  • 发电机教程:小白必学的柴油发电机技巧
  • 基础课1——人工智能的分类和层次
  • C语言复杂表达式与指针高级
  • 【Python从入门到进阶】39、使用Selenium自动验证滑块登录
  • 利用FPGA和CPLD数字逻辑实现模数转换器
  • 上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃
  • 间歇性微服务问题...
  • 小程序开发平台源码系统+ 带前后端完整搭建教程
  • 外部统一设置了::-webkit-scrollbar { display: none; }如何单独给特定元素开启滚动条设置样式-web页面滚动条样式设置
  • 【计算机网络】网络原理
  • 力扣第39题 组合总和 c++ 回溯剪枝题
  • qt软件正常运行的崩溃了定位行号方法
  • 软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏
  • 鸿蒙初体验
  • hive复合类型的数据查询
  • Notes/Domino 14 Early Access Drop3发布
  • 前端、后端开发者常用到的免费API整理
  • 【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题
  • 中断机制-通过volatile实现线程中断停止
  • Elasticsearch 8.11 中的合并更少,摄取更快
  • 算法村开篇
  • Leetcode—136.只出现一次的数字【简单】
  • 关于RNNoise、webrtc_ns、三角带通滤波器、对数能量
  • c语言练习89:链表的使用
  • ArkTS及openHarmony
  • Idea怎么配置Maven才能优先从本地仓库获取依赖
  • 聊聊HttpClient的DnsResolver
  • 剑指智能驾驶,智己LS6胜算几何?
  • 网络工程师知识点5