您的位置:首页 > 其它

备忘录模式

2021-12-21 23:05 85 查看

设计模式没有具体的落地代码,写着总感觉是抽象的概念而已


1. 备忘录模式(Memento Pattern)

在不违反封装的情况下保存、获取对象的内部状态,然后在需要的时候可以恢复之前的状态。应用在存档、回退操作(ctrl + z、浏览器回退)


备忘录模式的组成:

  • Originator:发起者
  • Memento:存储状态的对象
  • CareTaker:状态的管理器




2. 流程

流程的背景:模拟游戏内的存档,然后在需要的时候回退


2.1 Originator

public class Originator {

// 发起者内部状态(可有多个属性,这里为了简洁只写一个,用来表示角色等级)
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

// 创建内部的状态
public Memento createMemento() {
return new Memento(this.state);
}

// 回退操作
public void setMemento(Memento memento) {
this.state = memento.getState();
}
}


2.2 Memento

用于保存状态,也就是存档

public class Memento {
private String state;

public Memento(String state) {
this.state = state;
}

public String getState() {
return state;
}
}


2.3 CareTaker

存档的管理器,内部有多个状态

public class CareTaker {
Map<String, Memento> map = new HashMap<>();

public void add(String name, Memento memento) {
map.put(name, memento);
}

public Memento get(String name) {
return map.get(name);
}
}


2.4 测试

public class Test {
public static void main(String[] args) {

Originator originator = new Originator();
CareTaker careTaker = new CareTaker();

// 角色刚进新手村,等级为 1
originator.setState("1");
careTaker.add("2021-10-1", originator.createMemento());

// 新手村毕业了,等级为 10
originator.setState("10");
careTaker.add("2021-11-1", originator.createMemento());

// 游戏通关了,等级为 99
originator.setState("99");
careTaker.add("2021-12-1", originator.createMemento());

// 通关时的等级,1
System.out.println(originator.getState());

// 回档1,回到新手村,10
originator.setMemento(careTaker.get("2021-10-1"));
System.out.println(originator.getState());

// 回档2,回到新手村毕业,99
originator.setMemento(careTaker.get("2021-11-1"));
System.out.println(originator.getState());
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: