diff --git a/README/设计模式-v2.md b/README/设计模式-v2.md index 0455b82..7592b24 100644 --- a/README/设计模式-v2.md +++ b/README/设计模式-v2.md @@ -1701,6 +1701,114 @@ public class PaymentProcess { ## 备忘录模式---行为型 +**定义**:在不破坏封闭的前提下,捕获一个对象内部状态,并在该对象之外保存这个状态,这样以后就将该对象恢复到原先保存的状态。 + +需要角色:Originator(发起人)、Memento(备忘录)、Caretaker(管理者) + +备忘录可以实现功能:撤销、重做、历史记录、快照。 + +### 简单示例 + +#### 示例代码 + +```java +public class Memo { + public static void main(String[] args) { + // 定义记事本 + NoteEditText noteEditText = new NoteEditText(); + + // 负责管理记事本 + NoteCaretaker noteCaretaker = new NoteCaretaker(); + + // 写入记录 + noteEditText.content = "创建第一条记录。。。"; + noteCaretaker.saveMemo(noteEditText.createMemo()); + + // 再次写入 + noteEditText.content = "第三条记录。。。"; + noteCaretaker.saveMemo(noteEditText.createMemo()); + + // 写错撤销下 + noteEditText.restoreMemo(noteCaretaker.getPrevMemo()); + } + + // 备忘录角色-备忘录 + @Getter + static class Memento { + private final String content; + + public Memento(String content) { + this.content = content; + } + } + + // 存储备忘录--管理者 + static class NoteCaretaker { + private final List mementoList = new ArrayList<>(); + + // 存档位置 + private int index = 0; + + /** + * 添加内容到备忘录中 + * + * @param memento 备忘录 + */ + public void saveMemo(Memento memento) { + mementoList.add(memento); + index = mementoList.size() - 1; + for (Memento memento1 : mementoList) { + System.out.print(memento1.content + " "); + } + System.out.println(); + } + + /** + * 获取下一个 + * + * @return 备忘录 + */ + public Memento getNextMemo() { + index = index > (mementoList.size() - 1) ? index : mementoList.size() - 1; + return mementoList.get(index); + } + + /** + * 获取上一个 + * + * @return 备忘录 + */ + public Memento getPrevMemo() { + index = index > 0 ? (index - 1) : 0; + return mementoList.get(index); + } + } + + // 负责创建备忘录-发起人 + @Data + static class NoteEditText { + private String content; + + public Memento createMemo() { + return new Memento(content); + } + + public void restoreMemo(Memento memento) { + this.content = memento.content; + System.out.println("撤销记录:" + content); + } + } +} +``` + +#### 运行结果: + +```java +创建第一条记录。。。 +创建第一条记录。。。 第三条记录。。。 +撤销记录:创建第一条记录。。。 +``` + --- ## 中介者模式---行为型 diff --git a/pattern/src/main/java/cn/bunny/pattern12/Memo.java b/pattern/src/main/java/cn/bunny/pattern12/Memo.java new file mode 100644 index 0000000..bc34277 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern12/Memo.java @@ -0,0 +1,95 @@ +package cn.bunny.pattern12; + +import lombok.Data; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +public class Memo { + public static void main(String[] args) { + // 定义记事本 + NoteEditText noteEditText = new NoteEditText(); + + // 负责管理记事本 + NoteCaretaker noteCaretaker = new NoteCaretaker(); + + // 写入记录 + noteEditText.content = "创建第一条记录。。。"; + noteCaretaker.saveMemo(noteEditText.createMemo()); + + // 再次写入 + noteEditText.content = "第三条记录。。。"; + noteCaretaker.saveMemo(noteEditText.createMemo()); + + // 写错撤销下 + noteEditText.restoreMemo(noteCaretaker.getPrevMemo()); + } + + // 备忘录角色-备忘录 + @Getter + static class Memento { + private final String content; + + public Memento(String content) { + this.content = content; + } + } + + // 存储备忘录--管理者 + static class NoteCaretaker { + private final List mementoList = new ArrayList<>(); + + // 存档位置 + private int index = 0; + + /** + * 添加内容到备忘录中 + * + * @param memento 备忘录 + */ + public void saveMemo(Memento memento) { + mementoList.add(memento); + index = mementoList.size() - 1; + for (Memento memento1 : mementoList) { + System.out.print(memento1.content + " "); + } + System.out.println(); + } + + /** + * 获取下一个 + * + * @return 备忘录 + */ + public Memento getNextMemo() { + index = index > (mementoList.size() - 1) ? index : mementoList.size() - 1; + return mementoList.get(index); + } + + /** + * 获取上一个 + * + * @return 备忘录 + */ + public Memento getPrevMemo() { + index = index > 0 ? (index - 1) : 0; + return mementoList.get(index); + } + } + + // 负责创建备忘录-发起人 + @Data + static class NoteEditText { + private String content; + + public Memento createMemo() { + return new Memento(content); + } + + public void restoreMemo(Memento memento) { + this.content = memento.content; + System.out.println("撤销记录:" + content); + } + } +}