1. 作用
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态
2. 代码
2.1 备忘录实现类
package com.hz.design.memo;
/**
* @fileName: Memo
* @version:
* @description:
* @author: pp_lan
* @date: 2022/3/29
*/
public class Memo {
private String state;
public Memo(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void resolve() {
System.out.format("处理状态%s(可以根据状态定义不一样的处理器对象)\n", this.state);
}
}
package com.hz.design.memo;
import com.hz.model.CommonException;
/**
* @fileName: Starter
* @version:
* @description:
* @author: pp_lan
* @date: 2022/3/29
*/
public class Starter {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memo saveState() {
return new Memo(state);
}
/**
* 处理备忘录
* @param memo
*/
public void resolve(Memo memo) {
if(memo == null) {
throw new CommonException("无新的Memo可以处理");
}
System.out.format("当前状态%s, 开始处理.\n", memo.getState());
memo.resolve();
}
}
package com.hz.design.memo;
import com.hz.model.CommonException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @fileName: Watcher
* @version:
* @description:
* @author: pp_lan
* @date: 2022/3/29
*/
public class Watcher {
private final List<Memo> memoList;
public Watcher() {
this.memoList = new ArrayList<>();
}
public void add(Memo... memos) {
this.memoList.addAll(Arrays.asList(memos));
}
public Memo get(int index) {
if (index >= memoList.size()) {
return new Memo("暂无状态");
}
return memoList.get(index);
}
/**
* 获取迭代器
* @return
*/
public WatcherIterator interator() {
return new WatcherIterator();
}
class WatcherIterator {
private int index = 0;
public boolean hasNext() {
return index < memoList.size();
}
public Memo next() {
if (index < memoList.size()) {
return memoList.get(index++);
}
throw new CommonException("迭代超出长度");
}
}
}
2.2 测试(调用)类
package com.hz.design.memo;
/**
* @fileName: MemoTest
* @version:
* @description:
* @author: pp_lan
* @date: 2022/3/29
*/
public class MemoTest {
public static void main(String[] args) {
Starter starter = new Starter();
Watcher watcher = new Watcher();
// 执行者调整状态
starter.setState("起床");
// 看守者 保存 状态或者事件
watcher.add(starter.saveState());
starter.setState("吃饭");
watcher.add(starter.saveState());
starter.setState("上班");
watcher.add(starter.saveState());
// 使用迭代器模式获取看守者保存的状态信息
for (Watcher.WatcherIterator it = watcher.interator(); it.hasNext(); ) {
starter.resolve(it.next());
}
}
}
3. 调用结果
Connected to the target VM, address: '127.0.0.1:62947', transport: 'socket'
当前状态起床, 开始处理.
处理状态起床(可以根据状态定义不一样的处理器对象)
当前状态吃饭, 开始处理.
处理状态吃饭(可以根据状态定义不一样的处理器对象)
当前状态上班, 开始处理.
处理状态上班(可以根据状态定义不一样的处理器对象)
Disconnected from the target VM, address: '127.0.0.1:62947', transport: 'socket'