备忘录模式
用一个栈保存一个对象的一系列历史状态,在需要的时候可以恢复对象
- 定义:保存一个对象的某个状态,以便在适当的时候恢复对象,即“后悔药”
- 类型:行为型
- 适用场景:
- 保存及恢复数据相关业务场景
- 后悔的时候,即想恢复到之前的状态
- 优点:
- 为用户提供一种可恢复机制
- 存档信息的封装
- 缺点:资源占用
- 相关设计模式:
- 备忘录模式和状态模式:备忘录模式中,是用实例来表示状态的,也就是说存档的对象是一个实例对象,而在状态模式中是类表示状态
Coding
/** * 文章类 */ public class Article { private String title; private String content; private String imgs; public Article(String title, String content, String imgs) { this.title = title; this.content = content; this.imgs = imgs; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getImgs() { return imgs; } public void setImgs(String imgs) { this.imgs = imgs; } public ArticleMemento saveToMemento() { ArticleMemento articleMemento = new ArticleMemento(this.title, this.content, this.imgs); return articleMemento; } public void undoFromMemento(ArticleMemento articleMemento) { this.title = articleMemento.getTitle(); this.content = articleMemento.getContent(); this.imgs = articleMemento.getImgs(); } @Override public String toString() { return "Article{" + "title='" + title + '\'' + ", content='" + content + '\'' + ", imgs='" + imgs + '\'' + '}'; } } /** * 文章快照 */ public class ArticleMemento { private String title; private String content; private String imgs; public ArticleMemento(String title, String content, String imgs) { this.title = title; this.content = content; this.imgs = imgs; } public String getTitle() { return title; } public String getContent() { return content; } public String getImgs() { return imgs; } @Override public String toString() { return "ArticleMemento{" + "title='" + title + '\'' + ", content='" + content + '\'' + ", imgs='" + imgs + '\'' + '}'; } } /** * 文章快照管理者 */ public class ArticleMementoManager { private final Stack<ArticleMemento> ARTICLE_MEMENTO_STACK = new Stack<ArticleMemento>(); public ArticleMemento getMemento() { ArticleMemento articleMemento = ARTICLE_MEMENTO_STACK.pop(); return articleMemento; } public void addMemento(ArticleMemento articleMemento) { ARTICLE_MEMENTO_STACK.push(articleMemento); } }
UML
测试类
public class Test { public static void main(String[] args) { ArticleMementoManager articleMementoManager = new ArticleMementoManager(); Article article= new Article("如影随行的设计模式A","手记内容A","手记图片A"); ArticleMemento articleMemento = article.saveToMemento(); articleMementoManager.addMemento(articleMemento); System.out.println("标题:"+article.getTitle()+" 内容:"+article.getContent()+" 图片:"+article.getImgs()+" 暂存成功"); System.out.println("手记完整信息:"+article); System.out.println("修改手记start"); article.setTitle("如影随行的设计模式B"); article.setContent("手记内容B"); article.setImgs("手记图片B"); System.out.println("修改手记end"); System.out.println("手记完整信息:"+article); articleMemento = article.saveToMemento(); articleMementoManager.addMemento(articleMemento); article.setTitle("如影随行的设计模式C"); article.setContent("手记内容C"); article.setImgs("手记图片C"); System.out.println("暂存回退start"); System.out.println("回退出栈1次"); articleMemento = articleMementoManager.getMemento(); article.undoFromMemento(articleMemento); System.out.println("回退出栈2次"); articleMemento = articleMementoManager.getMemento(); article.undoFromMemento(articleMemento); System.out.println("暂存回退end"); System.out.println("手记完整信息:"+article); } } ==========输出=========== 标题:如影随行的设计模式A 内容:手记内容A 图片:手记图片A 暂存成功 手记完整信息:Article{title='如影随行的设计模式A', content='手记内容A', imgs='手记图片A'} 修改手记start 修改手记end 手记完整信息:Article{title='如影随行的设计模式B', content='手记内容B', imgs='手记图片B'} 暂存回退start 回退出栈1次 回退出栈2次 暂存回退end 手记完整信息:Article{title='如影随行的设计模式A', content='手记内容A', imgs='手记图片A'}