内容抄自《设计模式》清华大学出版社,2011
模式定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样
可以在以后将对象恢复到原先保存的状态。
结构分析:
包含角色:
1.Originator(原发器) 创建备忘录
2.Memento(备忘录)
3.Caretaker(负责人) 保存备忘录
模式分析:
public class Origin{
private String state;
public Memento save(){
return new Memento(this);
}
public void recover(Memento m){
this.state = m.state;
}
}
class Memento{
private String state;
public Memento(Origin o){
this.state = o.state;
}
}
public class Caretaker{
@Getter
@Setter
private Memento m;
}
优点:
1.提供了一种状态恢复的实现机制
缺点:
1.占用内存
适用环境:
1.保存一个对象的某个时刻的状态,可以恢复到先前的状态
2.一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态
Example:
public class Example {
static class Hun{
private int life;
private int level;
private int mala;
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getMala() {
return mala;
}
public void setMala(int mala) {
this.mala = mala;
}
}
static class HunWrapper extends Hun{
private Hun hun;
public HunWrapper(Hun hun){
this.hun = hun;
}
public Record save(int index){
return new Record(hun,index);
}
public void recover(Record r){
hun.level = r.level;
hun.life = r.life;
hun.mala = r.mala;
show();
}
public void kboss(){
System.out.println("魂打boss");
hun.life -= 5000;
hun.mala -= 3000;
show();
}
public void kbin(){
System.out.println("魂打小兵");
hun.life -= 1000;
hun.mala -= 500;
show();
}
public void show(){
if(hun.life<=0){
System.out.println("魂死了");
}
else{
System.out.println("魂剩余血量:"+hun.life);
System.out.println("魂剩余蓝量:"+hun.mala);
}
}
}
static class Record{
private int life;
private int level;
private int mala;
private int index;
public Record(Hun hun,int index) {
this.life = hun.life;
this.level = hun.level;
this.mala = hun.mala;
this.index = index;
}
public int getLife() {
return life;
}
public int getLevel() {
return level;
}
public int getMala() {
return mala;
}
public int getIndex() {
return index;
}
}
static class RecordKeeper{
private List<Record> list;
public RecordKeeper(){
list = new ArrayList<>(10);
}
public Record getRecord(int index){
return list.get(index);
}
public void setRecord(Record r){
list.add(r.getIndex(), r);
}
}
public static void main(String[] args) {
Hun hun = new Hun();
hun.level = 99;
hun.life = 8888;
hun.mala = 4512;
HunWrapper hunEx = new HunWrapper(hun);
RecordKeeper keeper = new RecordKeeper();
hunEx.show();
keeper.setRecord(hunEx.save(0));
hunEx.kbin();
keeper.setRecord(hunEx.save(1));
hunEx.kbin();
keeper.setRecord(hunEx.save(2));
hunEx.kboss();
hunEx.recover(keeper.getRecord(1));
hunEx.recover(keeper.getRecord(2));
hunEx.recover(keeper.getRecord(0));
}
}