设计模式之美:Memento(备忘录)
索引
别名
- Token
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
结构
参与者
Memento
- Memento 存储 Originator 对象的内部状态。Originator 根据需要决定 Memento 存储那些内部状态。
- 防止 Originator 以外的其他对象访问 Memento。Memento 可实现两个接口,Caretaker 只能看到 Memento 的窄接口,Originator 可以看到宽接口。
Originator
- Originator 创建一个 Memento,用以记录当前时刻的内部状态。
- 使用 Memento 恢复内部状态。
Caretaker
- 负责保存 Memento。
- 不能对 Memento 的内容进行操作和检查。
适用性
在以下情况下可以使用 Memento 模式:
- 必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态。
- 如果一个用接口来让其他对象直接得到的这些状态,将会暴露对象的实现细节并破坏对象的封装性。
效果
- 保持封装边界。
- 简化了 Originator。
- 定义窄接口和宽接口。
- 使用和维护 Memento 的潜在代价。
相关模式
- 可以使用 Memento 存储 Command 的内部状态,以支持撤销操作。
- Memento 可以使用 Iterator 进行迭代。
实现
Caretaker 向 Originator 请求一个 Memento,保留一段时间后,将其送回 Originator。
实现方式(一):Memento 模式结构样式代码。
Memento 有两个接口:一个为 Originator 所使用的宽接口,一个为其他对象所使用的窄接口。
namespace MementoPattern.Implementation1
{
public class Memento
{
private readonly string _state; public Memento(string state)
{
_state = state;
} public string GetState()
{
return _state;
}
} public class Originator
{
public string State { get; set; } public Memento CreateMemento()
{
return (new Memento(State));
} public void SetMemento(Memento memento)
{
State = memento.GetState();
}
} public class Caretaker
{
public Memento Memento { get; set; }
} public class Client
{
public void TestCase1()
{
var originator = new Originator { State = "State A" };
Console.WriteLine(originator.State); var memento = originator.CreateMemento();
var caretaker = new Caretaker { Memento = memento }; originator.State = "State B";
Console.WriteLine(originator.State); originator.SetMemento(caretaker.Memento);
Console.WriteLine(originator.State);
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Memento(备忘录)的更多相关文章
- 设计模式20:Memento 备忘录模式(行为型模式)
Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...
- 23种设计模式 - 状态变化(Memento备忘录 - State)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- 十八、Memento 备忘录设计模式
原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...
- 设计模式(18)--Memento(备忘录模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...
- 设计模式之美:Iterator(迭代器)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...
- 设计模式之美:Command(命令)
索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):直接注入 Receiver 对象,Command 决定调用哪个方法. 实现方式(二):注入 Receiver 的指定方法, ...
- Head First 设计模式系列之二----备忘录模式(java版)
申明:这几天无意中关注到备忘录模式,比较陌生回家一番参考书,只在附录里记录了该模式.后来在园子里有发现了有专门写设计模式的博客,并且写的也得牛逼.附上链接 http://www.cnblogs.com ...
- 《设计模式之美》 <03>面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是 ...
随机推荐
- (转)linux下cp目录时排除一个或者多个目录的实现方法
原文链接:http://www.jb51.net/LINUXjishu/88971.html 说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录 ...
- javascript:void(0)
这是不是一个设计缺陷呢 void(0)这种用法巧妙利用void关键字的特性返回undefined(且没有副作用).因为不是关键字,比如直接使用undefined,内容可能被改写. 再来看为啥使用0,而 ...
- cassandra-执行请求入口函数
参考 http://ju.outofmemory.cn/entry/115864 org.apache.cassandra.transport.Message中静态Dispatcher的 channe ...
- windows配置thrift开发环境
1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了 c:\windows ...
- Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误
如图,如果Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误,具体解决方法如下 ...
- nginx启动脚本
#!/bin/sh # # nginx - this script starts and stops the nginx daemin # # chkconfig: - 85 15 # descr ...
- ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节集合
核心代码 using System; using System.Data; using System.Configuration; using System.Web; using System.Web ...
- java 单利模式
首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...
- 高等微积分及其应用 nicholas.pdf——下载地址
http://pan.baidu.com/share/link?shareid=426414429&uk=3977204074 这本书在网络上很少有了,本人是在群里下过来整理成一个文档了,由n ...
- [Python] Pitfalls: About Default Parameter Values in Functions
Today an interesting bug (pitfall) is found when I was trying debug someone's code. There is a funct ...