使用备忘录模式实现草稿箱功能
下面我们使用备忘录模式来实现这样一个功能。假设我们在 新宝库中发布一篇文章,文章编辑的过程需要花很长时间,中间也会不停的撤销、修改,甚至可能要花好几天才能写出一篇精品文章,所以可能会将已经编辑好的内容实时保存到草稿箱。
首先创建文本编辑器类 TextEditor(发起人角色)。
package net.biancheng.c.memento; public class TextEditor { private String title; private String content; private String imgs; public TextEditor(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; } public void setTitle(String title) { this.title = title; } public void setContent(String content) { this.content = content; } 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 "Editor{" + "title='" + title + '\'' + ", content='" + content + '\'' + ", imgs='" + imgs + '\'' + '}'; } }然后创建备忘录角色 ArticleMemento 类。
package net.biancheng.c.memento; 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 + '\'' + '}'; } }接着创建备忘录管理角色草稿箱 Drafts 类。
package net.biancheng.c.memento; import java.util.Stack; public class Drafts { private final Stack<ArticleMemento> STACK = new Stack<ArticleMemento>(); public ArticleMemento getMemento() { ArticleMemento articleMemento = STACK.pop(); return articleMemento; } public void addMemento(ArticleMemento articleMemento) { STACK.push(articleMemento); } }草稿箱中定义的 Stack 类是 Vector 的一个子类,它实现了一个标准的后进先出的栈。如下表所示,主要定义了以下方法。
方法定义 | 方法描述 |
---|---|
boolean empty() | 判断堆栈是否为空 |
Object peek() | 查看堆栈顶部的对象,但不从堆栈中移除它 |
Object pop() | 移除堆栈顶部的对象,并作为此函数的值返回该对象 |
Object push(Object element) | 把对象压入堆栈顶部 |
int search(Object element) | 返回对象在堆栈中的位置,以1为基数 |
package net.biancheng.c.memento; public class Test { public static void main(String[] args) { Drafts Drafts = new Drafts(); TextEditor TextEditor = new TextEditor("Java设计模式", "本文节选自《Java设计模式》教程,新宝库原创。", "1.png"); ArticleMemento articleMemento = TextEditor.saveToMemento(); Drafts.addMemento(articleMemento); System.out.println("标题:" + TextEditor.getTitle() + "\n" + "内容:" + TextEditor.getContent() + "\n" + "插图:" + TextEditor.getImgs() + "\n暂存成功"); System.out.println("完整信息" + TextEditor); System.out.println("==========首次修改文章==========="); TextEditor.setTitle("Java设计模式:23种设计模式全面解析"); TextEditor.setContent("本文节选自《Java设计模式:23种设计模式全面解析》教程,新宝库原创教程。"); System.out.println("==========首次修改文章完成==========="); System.out.println("完整信息" + TextEditor); articleMemento = TextEditor.saveToMemento(); Drafts.addMemento(articleMemento); System.out.println("==========保存到草稿箱==========="); System.out.println("==========第2次修改文章==========="); TextEditor.setTitle("Java设计模式:23种设计模式全面解析(超级详细)"); TextEditor.setContent("本文节选自《Java设计模式:23种设计模式全面解析》教程,新宝库原创。"); System.out.println("完整信息" + TextEditor); System.out.println("==========第2次修改文章完成==========="); System.out.println("==========第1次撤销==========="); articleMemento = Drafts.getMemento(); TextEditor.undoFromMemento(articleMemento); System.out.println("完整的信息" + TextEditor); System.out.println("==========第1次撤销完成==========="); System.out.println("==========第2次撤销==========="); articleMemento = Drafts.getMemento(); TextEditor.undoFromMemento(articleMemento); System.out.println("完整的信息" + TextEditor); System.out.println("==========第2次撤销完成==========="); } }运行结果如下所示。
标题:Java设计模式
内容:本文节选自《Java设计模式》教程,新宝库原创。
插图:1.png
暂存成功
完整信息Editor{title='Java设计模式', content='本文节选自《Java设计模式》教程,新宝库原创。', imgs='1.png'}
==========首次修改文章===========
==========首次修改文章完成===========
完整信息Editor{title='Java设计模式:23种设计模式全面解析', content='本文节选自《Java设计模式:23种设计模式全面解析》教程,新宝库原创教程。', imgs='1.png'}
==========保存到草稿箱===========
==========第2次修改文章===========
完整信息Editor{title='Java设计模式:23种设计模式全面解析(超级详细)', content='本文节选自《Java设计模式:23种设计模式全面解析》教程,新宝库原创。', imgs='1.png'}
==========第2次修改文章完成===========
==========第1次撤销===========
完整的信息Editor{title='Java设计模式:23种设计模式全面解析', content='本文节选自《Java设计模式:23种设计模式全面解析》教程,新宝库原创教程。', imgs='1.png'}
==========第1次撤销完成===========
==========第2次撤销===========
完整的信息Editor{title='Java设计模式', content='本文节选自《Java设计模式》教程,新宝库原创。', imgs='1.png'}
==========第2次撤销完成===========
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算