feat: 备忘录模式

This commit is contained in:
Bunny 2025-02-03 17:20:40 +08:00
parent 4782334a63
commit b90a5bef13
2 changed files with 203 additions and 0 deletions

View File

@ -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<Memento> 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
创建第一条记录。。。
创建第一条记录。。。 第三条记录。。。
撤销记录:创建第一条记录。。。
```
---
## 中介者模式---行为型

View File

@ -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<Memento> 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);
}
}
}