使用备忘录模式实现草稿箱功能
下面我们使用备忘录模式来实现这样一个功能。假设我们在 新宝库中发布一篇文章,文章编辑的过程需要花很长时间,中间也会不停的撤销、修改,甚至可能要花好几天才能写出一篇精品文章,所以可能会将已经编辑好的内容实时保存到草稿箱。
首先创建文本编辑器类 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
- 大数据
- 云计算