feat: 备忘录模式
This commit is contained in:
parent
4782334a63
commit
b90a5bef13
|
@ -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
|
||||||
|
创建第一条记录。。。
|
||||||
|
创建第一条记录。。。 第三条记录。。。
|
||||||
|
撤销记录:创建第一条记录。。。
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 中介者模式---行为型
|
## 中介者模式---行为型
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue