备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
白箱备忘录模式Demo:
/**
* 2018年4月1日下午11:54:24
*/
package com.Designpattern;
/**
* @author xinwenfeng
*
*/
public class TestMemento {
/**
* @param args
*/
public static void main(String[] args) {
Originator o = new Originator();
o.setState("折纸到第三步成功");
o.show();
MyCaretaker c = new MyCaretaker();
MyMemento m = o.CreateMemento();//创建备忘录
c.setMemento(m);//交给管理者
o.setState("折纸到第四部错误");
o.show();
o.SetMemento(c.getMemento());//从管理者拿到备忘录并回滚
o.show();
}
}
//备忘录
class MyMemento{
private String state;
public MyMemento(String s) {
state = s;
}
public String getState() {
return state;
}
}
//管理者
class MyCaretaker{
private MyMemento memento;
public MyMemento getMemento() {
return memento;
}
public void setMemento(MyMemento memento) {
this.memento = memento;
}
}
class Originator{
private String state;//属性
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public MyMemento CreateMemento() {
return new MyMemento(state);//将当前属性保存,并得到备忘录
}
public void SetMemento(MyMemento m) {
state = m.getState();//将当前属性设置成备忘录里的
}
public void show() {
System.out.println("操作:"+state);
}
}
结果:
黑箱备忘录:Memento使用一个空的标识接口,Originator里使用内部类实现Memento接口,Caretaker里使用空接口,防止了对Memento的操作;
黑箱备忘录Demo:
/**
* 2018年10月16日上午10:56:25
*/
package testMemento;
/**
* @author XWF
*
*/
public class TestMemento {
/**
* @param args
*/
public static void main(String[] args) {
Game g = new Game();
g.setState("begin");
g.showState();
g.setState("step 1");
g.showState();
g.setState("step 2");
g.showState();
g.createMemento();
g.setState("step 3333");
g.showState();
g.setState("error step");
g.showState();
g.callBack();
g.showState();
}
}
class Game{
private String state;
private class MementoInner implements Memento{
String state;
public MementoInner(String state) {
this.state = state;
}
public void setState(String s) {
state = s;
}
public String getState() {
return state;
}
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public void createMemento() {
System.out.println("create memento state:"+state);
Caretaker.setMemento(new MementoInner(state));
}
public void callBack() {
System.out.println("callback");
this.state = ((MementoInner)Caretaker.getMemento()).getState();
}
public void showState() {
System.out.println("state is:"+state);
}
}
class Caretaker{
private static Memento m;
public static Memento getMemento() {
return m;
}
public static void setMemento(Memento memento) {
m = memento;
}
}
interface Memento{
}
结果: