【23种设计模式】备忘录模式(Memento Pattern) .Net Core实现
简介
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
其实很多应用软件都提供了这项功能,如 Word、记事本、Photoshop、Eclipse 等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。
备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:通过一个备忘录类专门存储对象状态。
关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。
应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctrl + z。 4、IE 中的后退。 5、数据库的事务管理。
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。
模式的结构
备忘录模式的主要角色如下。
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
备忘录模式的结构图如图 1 所示。
模式的实现
package net.biancheng.c.memento;
public class MementoPattern {
public static void main(String[] args) {
Originator or = new Originator();
Caretaker cr = new Caretaker();
or.setState("S0");
System.out.println("初始状态:" + or.getState());
cr.setMemento(or.createMemento()); //保存状态
or.setState("S1");
System.out.println("新的状态:" + or.getState());
or.restoreMemento(cr.getMemento()); //恢复状态
System.out.println("恢复状态:" + or.getState());
}
}
//备忘录
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
//发起人
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento m) {
this.setState(m.getState());
}
}
//管理者
class Caretaker {
private Memento memento;
public void setMemento(Memento m) {
memento = m;
}
public Memento getMemento() {
return memento;
}
}
程序运行的结果如下:
初始状态:S0
新的状态:S1
恢复状态:S0
来源
相关文章
- .Net Core 部署到 CentOS7 64 位系统中的步骤
- C#.Net实体代码生成工具(EntitysCodeGenerate)的使用及.NET中的ORM实现
- .NET开源Protobuf-net组件葵花手册
- 重新整理 .net core 实践篇—————工作单元模式[二十六]
- ASP.NET Core 中间件详解及项目实战
- 重新整理 .net core 实践篇—————HttpClientFactory[三十二]
- 重新整理 .net core 实践篇—————工作单元模式[二十六]
- 重新整理 .net core 实践篇—————异常中间件[二十]
- ASP.NET Core 在 IIS 下的两种部署模式
- ASP.NET Core 6框架揭秘实例演示[13]:日志的基本编程模式
- ASP.NET Core 6框架揭秘实例演示[05]:依赖注入基本编程模式
- ASP.NET Core应用基本编程模式[2]:依赖注入
- 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
- [ASP.NET Core 3框架揭秘]服务承载系统[4]:总体设计[下篇]
- [ASP.NET Core 3框架揭秘] 服务承载系统[2]: 承载长时间运行的服务[下篇]
- [ASP.NET Core 3框架揭秘] Options[7]: 与配置系统的整合
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]
- .NET Core的日志[5]:利用TraceSource写日志
- .NET Core的日志[1]:采用统一的模式记录日志
- .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
- atitit. 集合groupby 的实现(2)---自定义linq查询--java .net php
- Net Core 微服务 - 如何在docker容器里运行一个简单的.net core web api 服务
- 用Middleware给ASP.NET Core Web API添加自己的授权验证