JAVA 设计模式 备忘录模式

用途

备忘录模式 (Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。

备忘录模式是一种行为型模式

结构

图-备忘录模式结构图

Memento : 负责存储 Originator 对象的内部状态,并可以防止 Originator 以外的其他对象访问 Memento。 Memento 有两个接口,Caretaker 只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。 Originator 可以看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

class Memento {
 private String state;
 public Memento(String state) {
 this.state = state;
     }
 
 public String GetState() {
 return state;
     }
 }

Originator : 负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。 Originator 可根据需要决定 Memento 存储 Originator 的哪些内部状态。

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 SetMemento(Memento memento) {
         state = memento.GetState();
     }
 
 public void Show() {
         System.out.println("State = " + state);
     }
 }

Caretaker : 负责保存好备忘录 Memento,不能对备忘录的内容进行操作或检查。

class Caretaker {
 private Memento memento;
 
 public void SetMemento(Memento memento) {
 this.memento = memento;
     }
 public Memento GetMemento() {
 return memento;
     }
 }

测试代码

public class MementoPattern {
 public static void main(String[] args) {
         Originator o = new Originator();
         o.SetState("ON");
         o.Show();
 
         Caretaker c = new Caretaker();
         c.SetMemento(o.CreateMemento());
 
         o.SetState("OFF");
         o.Show();
 
         o.SetMemento(c.GetMemento());
         o.Show();
     }
 }

运行结果

State = ON
State = OFF
State = ON

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

学习HTML5之塔克大战(详细记录)

          学了一些HTML5的一些基本知识,开始学习制作......           介绍一些基本知识:  px(像素)---》1px等于多少? ...

3247
来自专栏张善友的专栏

Caliburn Micro for Windows Phone 7

Caliburn Micro (caliburnmicro.codeplex.com) 是一个小巧但功能强大的 Caliburn (caliburn.codep...

1808
来自专栏DeveWork

小谈中文环境下中文排版的font-family 字体选择

在开发Mindia 主题的时候,为了弄出相对好看的中文排版,特意补习了下中文排版的font-family 字体选择的相关资料。以下就从自己的角度说下自己的不算得...

21810
来自专栏Modeng的专栏

canvas学习总结六:绘制矩形

版权声明:本文为原创文章发布于公众号:Modeng , 你可以随意转载但请务必注明出处!!! https://blog.csdn.net/qq_32135281...

711
来自专栏前端说吧

CSS-背景渐变的兼容写法

3485
来自专栏.NET开发者社区

​(码友推荐)2018-09-18 .NET及相关开发资讯速递

1.Redis 桌面管理工具 RedisDesktopManager 0.9.6 发布

1045
来自专栏NetCore

Fluent NHibernate 之旅 导航篇

ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文...

1857
来自专栏张善友的专栏

网上Silverlight项目收集

1、Silverlight + OpenXML Video  :This is a Silverlight proof of concept applicati...

1959
来自专栏我和未来有约会

Silverlight网络寻奇 at 090428

都是Silverlight做的游戏 http://www.silverarcade.com/Games Introducing Html Utilities f...

2984
来自专栏GIS讲堂

Openlayers4中实现动态线效果

2822

扫码关注云+社区