From 189102cd00fd815395a8d01284d753f081859544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Tue, 21 Jul 2020 16:01:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E5=BF=98=E5=BD=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pattern/behavior/memento/Article.java | 42 +++++++++++++++++++ .../behavior/memento/ArticleMemento.java | 27 ++++++++++++ .../memento/ArticleMementoManager.java | 27 ++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/Article.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMemento.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMementoManager.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/Article.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/Article.java new file mode 100644 index 0000000..9d0874f --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/Article.java @@ -0,0 +1,42 @@ +package top.fjy8018.designpattern.pattern.behavior.memento; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 文章,字段不宜过多,否则导致过大内存占用 + * + * @author F嘉阳 + * @date 2020/3/6 17:00 + */ +@Data +@AllArgsConstructor +public class Article { + + private String title; + + private String content; + + private String imgs; + + /** + * 保存 + * + * @return + */ + public ArticleMemento saveToMemento() { + ArticleMemento articleMemento = new ArticleMemento(this.title, this.content, this.imgs); + return articleMemento; + } + + /** + * 撤销 + * + * @param articleMemento + */ + public void undoFromMemento(ArticleMemento articleMemento) { + this.title = articleMemento.getTitle(); + this.content = articleMemento.getContent(); + this.imgs = articleMemento.getImgs(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMemento.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMemento.java new file mode 100644 index 0000000..498f62a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMemento.java @@ -0,0 +1,27 @@ +package top.fjy8018.designpattern.pattern.behavior.memento; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; +import org.springframework.binding.message.StateManageableMessageContext; + +/** + * 文章备忘录(快照) + * 快照不需要set方法,只能通过构造器注入 + *

+ * Spring工作流中源码 {@link StateManageableMessageContext#createMessagesMemento()} + * + * @author F嘉阳 + * @date 2020/3/6 17:03 + */ +@Getter +@ToString +@AllArgsConstructor +public class ArticleMemento { + + private String title; + + private String content; + + private String imgs; +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMementoManager.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMementoManager.java new file mode 100644 index 0000000..9441ba1 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/memento/ArticleMementoManager.java @@ -0,0 +1,27 @@ +package top.fjy8018.designpattern.pattern.behavior.memento; + +import java.util.Stack; + +/** + * 保存一个对象的某个状态,以便在适当的时候恢复对象 + * + * @author F嘉阳 + * @date 2020/3/6 17:04 + */ +public class ArticleMementoManager { + + /** + * 使用栈特性实现动作撤销 + */ + private final Stack ARTICLE_MEMENTO_STACK = new Stack(); + + public ArticleMemento getMemento() { + ArticleMemento articleMemento = ARTICLE_MEMENTO_STACK.pop(); + return articleMemento; + } + + public void addMemento(ArticleMemento articleMemento) { + ARTICLE_MEMENTO_STACK.push(articleMemento); + } + +}