前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式-备忘录模式】

【设计模式-备忘录模式】

作者头像
Liusy
发布2020-09-01 16:26:38
5140
发布2020-09-01 16:26:38
举报
文章被收录于专栏:Liusy01Liusy01

【导读】浏览器网址框旁边会有一个点击可后退的按钮,点击之后可返回上一个浏览页面。这就是备忘录模式。利用某种数据结构保存之前的状态。

一、定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

二、实例

比如日常编写word文档的时候,除了经常使用CV大法之外,还有撤回快捷键Ctrl+Z,可返回到上一个保存的状态。

文章对象:

代码语言:javascript
复制
public class Article {
    //标题
    private String title;
    //内容
    private String content;

    public Article(String title, String content) {
        this.title = title;
        this.content = content;
    }

    //撤回操作
    public void recover(ArticleMemento articleMemento) {
        this.title = articleMemento.getTitle();
        this.content = articleMemento.getContent();
    }

   //保存为一个缓存对象
    public ArticleMemento saveToCache(){
        ArticleMemento articleMemento = new ArticleMemento(title,content);
        return articleMemento;
    }

}

文章缓存对象:

代码语言:javascript
复制
1、属性跟文章对象一致   
public class ArticleMemento {

    private String title;
    private String content;

    public ArticleMemento(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

缓存对象管理:

代码语言:javascript
复制
public class ArticleMementoManager {
    
    private static final Stack<ArticleMemento> stack = new Stack<ArticleMemento>();

    //将缓存对象入栈,相当于word的保存按钮
    public void addMemento(ArticleMemento articleMemento){
        System.out.println("将【"+articleMemento.toString()+"】进行暂存");
        stack.push(articleMemento);
    }

   //撤回,将最后一个缓存对象出栈,相当于撤回  
    public ArticleMemento recover(){
        ArticleMemento pop = stack.pop();
        return pop;
    }


}

利用栈先进后出的特性保存缓存对象。

测试代码:

代码语言:javascript
复制
ArticleMementoManager articleMementoManager = new ArticleMementoManager();
Article article = new Article("标题","内容");
System.out.println("新建一篇文章:【"+article.toString()+"】");
ArticleMemento articleMemento = article.saveToCache();
articleMementoManager.addMemento(articleMemento);

article.setContent("第一次修改内容");
System.out.println("将文章修改为:【"+article.toString()+"】");
articleMemento = article.saveToCache();
articleMementoManager.addMemento(articleMemento);

article.setTitle("第一次修改标题");
System.out.println("将文章修改为:【"+article.toString()+"】");


System.out.println("需要对文章进行第一次回退操作");
article.recover(articleMementoManager.recover());
System.out.println("回退之后文章为:【"+article.toString()+"】");

System.out.println("需要对文章进行第二次回退操作");
article.recover(articleMementoManager.recover());
System.out.println("回退之后文章为:【"+article.toString()+"】");

运行结果:

整体流程如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Liusy01 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档