首先设计一个抽象发起人类,一个具体发起人类继承该抽象类,一个备忘录接口,一个管理者抽象类,一个具体管理者类继承该抽象类,最后是客服端主类。发起人抽象类实现备忘录类,管理者抽象类聚合备忘录类。
备忘录类:
package com.freshbin.pattern.memento.myexample.memento;
/**
* 备忘录接口
*
* @author freshbin
* @date 2019年1月20日 上午11:20:35
*/
public interface Memento {
}
发起人抽象类:
package com.freshbin.pattern.memento.myexample.originator;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import com.freshbin.pattern.memento.myexample.memento.Memento;
/**
* 发起人接口
*
* @author freshbin
* @date 2019年1月20日 上午11:21:43
*/
public abstract class Originator implements Serializable, Cloneable{
protected String id;
protected Integer level;
public Originator(String id, Integer level) {
this.id = id;
this.level = level;
}
public Memento createMemento() throws CloneNotSupportedException {
return new MemetoInner(this);
}
public Originator restoreMemento(Memento memento) throws CloneNotSupportedException {
Originator originator = ((MemetoInner) memento).restoreMemento();
return (Originator)originator.clone();
}
private class MemetoInner implements Memento {
private Originator originator;
public MemetoInner(Originator originator) throws CloneNotSupportedException {
this.originator = (Originator) originator.clone();
}
public Originator restoreMemento() {
return originator;
}
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
发起人子类
package com.freshbin.pattern.memento.myexample.originator;
public class OriginatorA extends Originator {
public OriginatorA(String id, Integer level) {
super(id, level);
}
}
管理者抽象类:
package com.freshbin.pattern.memento.myexample.carertaker;
import java.util.HashMap;
import java.util.Map;
import com.freshbin.pattern.memento.myexample.memento.Memento;
/**
* 管理者接口
*
* @author freshbin
* @date 2019年1月20日 上午11:23:02
*/
public abstract class Caretaker {
public Map<String, Memento> mementorMap;
public Caretaker() {
this.mementorMap = new HashMap<>(16);
}
public void saveMementor(String id, Memento mementor) {
mementorMap.put(id, mementor);
}
public Memento retrieveMemento(String id) {
return mementorMap.get(id);
}
public Map<String, Memento> getMementorMap() {
return mementorMap;
}
}
管理者子类:
package com.freshbin.pattern.memento.myexample.carertaker;
/**
* 管理类子类
*
* @author freshbin
* @date 2019年1月20日 上午11:47:46
*/
public class ConcreteCaretakerA extends Caretaker {
}
客户端主类:
package com.freshbin.pattern.memento.myexample;
import com.freshbin.pattern.memento.myexample.carertaker.Caretaker;
import com.freshbin.pattern.memento.myexample.carertaker.ConcreteCaretakerA;
import com.freshbin.pattern.memento.myexample.originator.Originator;
import com.freshbin.pattern.memento.myexample.originator.OriginatorA;
/**
* 备忘录模式
*
* @author freshbin
* @date 2019年1月20日 上午11:13:36
*/
public class MementoPatternDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Caretaker caretaker = new ConcreteCaretakerA();
Originator originatorA = new OriginatorA("1", 1);
// 存档
caretaker.saveMementor(originatorA.getId(), originatorA.createMemento());
// 升级
originatorA.setLevel(2);
System.out.println("当前等级:" + originatorA.getLevel());
//读取存档
originatorA = originatorA.restoreMemento(caretaker.getMementorMap().get(originatorA.getId()));
System.out.println("读取存档后的等级:" + originatorA.getLevel());
//再升级
originatorA.setLevel(3);
System.out.println("当前等级:" + originatorA.getLevel());
//读取存档
originatorA = originatorA.restoreMemento(caretaker.getMementorMap().get(originatorA.getId()));
System.out.println("读取存档后的等级:" + originatorA.getLevel());
}
}
效果: