备忘录模式是一种行为模式,用来记录的中间状态,在需要时使对象恢复到某个中间状态。
我们在写代码时,发现代码结构不理想或者出错,恢复到过去的某种状态就是这种情况,代码如下:
package com.zhang.memento;
import java.util.ArrayList;
import java.util.List;
// 备忘录类
class Memento {
private List<String> mem = new ArrayList<String>();
public void save(String str) {
mem.add(str);
}
public void display() {
for (int i = 0; i < mem.size(); i++) {
System.out.println("========= " + i + " =========");
}
}
public String recover(int index) {
if (index >= mem.size())
return null;
return mem.get(index);
}
public void clear() {
mem.clear();
}
}
// 程序类
class MyProgram {
private StringBuffer code;
public MyProgram() {
code = new StringBuffer();
}
public void addCode(String code) {
this.code.append(code);
}
public void setCode(String code) {
this.code = new StringBuffer(code);
}
public String getCode() {
return code.toString();
}
public void display() {
System.out.println(getCode());
}
}
public class MementoPattern {
public static void main(String[] args) {
MyProgram p = new MyProgram();
Memento m = new Memento();
for(int i = 0; i < 10; i ++) {
p.addCode("code: " + i + "\n");
// 每加一行代码都记录一下状态
m.save(p.getCode());
}
p.display();
// 恢复以前的状态
p.setCode(m.recover(5));
p.display();
}
}
实现很简单,把备忘录功能直接写在程序类内部也可以,但这样就使“程序类”与“备忘录类”的功能混合在一起。只所以分开实现是为了最大程序的“解耦",可以看到这种实现方式下,程序类与备忘录之间实现上并没有任何关系。