快照模式(令牌模式):保存一个对象的状态,需要的时候可以恢复
public class ArticleText {
private String title;//文章标题
private String content;//文章内容
private Date createTime;//文章创建时间
public ArticleText(String title, String content, Date createTime) {
this.title = title;
this.content = content;
this.createTime = createTime;
}
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 Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public ArticleMemento saveToMemento(){//这个方法用来保存快照
ArticleMemento articleMemento = new ArticleMemento(this.title,this.content,this.createTime);
return articleMemento;
}
public void getArticleFromMemento(ArticleMemento articleMemento){//这个方法用来还原文章
this.title = articleMemento.getTitle();
this.content = articleMemento.getContent();
this.createTime = articleMemento.getCreateTime();
}
}
public class ArticleMemento {
private String title;
private String content;
private Date createTime;
public ArticleMemento(String title, String content, Date createTime) {
this.title = title;
this.content = content;
this.createTime = createTime;
}
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 Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
public class ArticleCaretaker {
private final List<ArticleMemento> list = new ArrayList<>();
public ArticleMemento getArticle(int index){
return list.get(index);
}
public void setArticle(ArticleMemento articleMemento){
list.add(articleMemento);
}
}
public class TestMemento {
public static void main(String[] args) {
ArticleCaretaker articleCaretaker = new ArticleCaretaker();
ArticleText articleText = new ArticleText("标题1","内容1",new Date());
ArticleMemento articleMemento = articleText.saveToMemento();
articleCaretaker.setArticle(articleMemento);//备份1次
articleText = new ArticleText("标题2","内容2",new Date());
System.out.println(String.format("修改后的标题为【%s】,内容为【%s】",articleText.getTitle(),articleText.getContent()));
articleText.getArticleFromMemento(articleCaretaker.getArticle(0));
System.out.println(String.format("还原后的标题为【%s】,内容为【%s】",articleText.getTitle(),articleText.getContent()));
}
}
适用场景:
需要保存快照
优点:
隔离状态的存储与获取
缺点:
消耗硬盘或者内存