/** * 发起人类 */ public class Originator { /** * 状态编码 */ private String status; public Originator(String status) { this.status = status; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } /** * 建立备忘录 * @return */ public Memento createMemento() { return new Memento(this); } /** * 回滚 * @param memento */ public void restoreMemento(Memento memento) { this.status = memento.getStatus(); } } /** * 备忘录类 */ public class Memento { private String status; public Memento(Originator originator) { this.status = originator.getStatus(); } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } } /** * 备忘录管理类 */ public class Caretaker { /** * 备忘录记录栈 */ private Stack<Memento> MEMENTO_STACK; public Caretaker() { MEMENTO_STACK = new Stack<>(); } /** * 添加一个备忘录 * @param memento */ public void addMemento(Memento memento) { MEMENTO_STACK.push(memento); } /** * 获取一个备忘录 * @return */ public Memento getMemento() { return MEMENTO_STACK.pop(); } }
/** * 测试与应用 */ public class Test { public static void main(String[] args) { //备忘录管理 Caretaker caretaker = new Caretaker(); //发起人 Originator originator = new Originator("1"); //建立备忘录1 Memento memento1 = originator.createMemento(); caretaker.addMemento(memento1); //修改并建立备忘录2 originator.setStatus("2"); Memento memento2 = originator.createMemento(); caretaker.addMemento(memento2); //修改状态3 originator.setStatus("3"); System.out.println(originator.getStatus()); //回滚上一次 originator.restoreMemento(caretaker.getMemento()); System.out.println(originator.getStatus()); //回滚上一次 originator.restoreMemento(caretaker.getMemento()); System.out.println(originator.getStatus()); } }
3 2 1
备忘录模式角色介绍html
在线编辑文章时,能够回退功能得备忘录模式实现。
/** * 文章类 */ public class Article { //标题 private String title; //内容 private String content; //图片 private String images; public Article(String title, String content, String images) { this.title = title; this.content = content; this.images = images; } 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 getImages() { return images; } public void setImages(String images) { this.images = images; } public ArticleMemento saveToMemento() { return new ArticleMemento(this); } public void undoFromMemento(ArticleMemento articleMemento) { this.title = articleMemento.getTitle(); this.content = articleMemento.getContent(); this.images = articleMemento.getImages(); } @Override public String toString() { return "Article{" + "title='" + title + '\'' + ", content='" + content + '\'' + ", images='" + images + '\'' + '}'; } } /** * 备忘录类 */ public class ArticleMemento { private String title; private String content; private String images; public ArticleMemento(Article article) { this.title = article.getTitle(); this.content = article.getContent(); this.images = article.getImages(); } public String getTitle() { return title; } public String getContent() { return content; } public String getImages() { return images; } @Override public String toString() { return "ArticleMemento{" + "title='" + title + '\'' + ", content='" + content + '\'' + ", images='" + images + '\'' + '}'; } } /** * 备忘录管理类 */ public class ArticleMementoManager { private final Stack<ArticleMemento> ARTICLE_MEMENTO_STACK = new Stack<>(); public ArticleMemento getMemento () { return ARTICLE_MEMENTO_STACK.pop(); } public void addMemento(ArticleMemento articleMemento) { ARTICLE_MEMENTO_STACK.push(articleMemento); } }
/** * 测试与应用 */ 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.toString()); article.setTitle("修改手记start"); article.setContent("手记内容B"); article.setImages("手记图片B"); System.out.println(article); articleMemento = article.saveToMemento(); articleMementoManager.addMemento(articleMemento); article.setTitle("设计模式C"); article.setContent("手记内容C"); article.setImages("手记图片C"); System.out.println(article.toString()); System.out.println("回退出栈一次"); articleMemento = articleMementoManager.getMemento(); article.undoFromMemento(articleMemento); System.out.println(article.toString()); System.out.println("回退出栈两次"); articleMemento = articleMementoManager.getMemento(); article.undoFromMemento(articleMemento); System.out.println(article.toString()); } }
Article{title='design-pattern1', content='memento1', images='memento1'} Article{title='design-pattern2', content='memento2', images='memento2'} Article{title='design-pattern3', content='memento3', images='memento3'} pop stack 1. Article{title='design-pattern2', content='memento2', images='memento2'} pop stack 2. Article{title='design-pattern1', content='memento1', images='memento1'}
备忘录模式和状态模式java
慕课网设计模式精讲
:https://coding.imooc.com/class/270.html 备忘录模式(详尽版)
:http://c.biancheng.net/view/1400.html