大话设计模式学习笔记(18)——备忘录模式
2018-03-26 15:39
127 查看
源码git地址 https://github.com/dlovetco/designMode
代码写到现在,相信小伙伴们都应该知道要注意一些什么事情。
比如:
- 降低类与类之间的耦合性,尽量面向接口编程
- 尽可能的降低类的可见性。客户端能接触到的类越少越好(包括类的实现细节),这就要求我们在设计的时候尽可能的考虑封装性。
输出:
Status{attack=100, defend=100, hp=100}
Status{attack=0, defend=0, hp=0}
Status{attack=100, defend=100, hp=100}
Status是角色的实时状态,Save是角色在某个瞬间保存下来的状态然后把这个save对象移交给SaveManager管理。
注意:备忘录模式其实是使用额外的空间保存目标对象的“快照”。所以如果目标对象过于庞大,那么在使用备忘录模式之前 须“三思而后行”
问题提出
玩游戏的时候在打boss之前都会保存一下,如果被boss打死了还可以读档重新来过。试着用代码实现这种保存的机制。代码写到现在,相信小伙伴们都应该知道要注意一些什么事情。
比如:
- 降低类与类之间的耦合性,尽量面向接口编程
- 尽可能的降低类的可见性。客户端能接触到的类越少越好(包括类的实现细节),这就要求我们在设计的时候尽可能的考虑封装性。
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。package memento; import java.util.HashMap; import java.util.Map; public class MementoMode { public static void main(String[] args) { Status status = new Status(100, 100, 100); SaveManager saveManager = new SaveManager(); saveManager.createSave(status.save()); System.out.println(status); status.attack = 0; status.defend = 0; status.hp = 0; System.out.println(status); status.load(saveManager.getSave(1)); System.out.println(status); } } /** * 状态 */ class Status { int attack; int defend; int hp; public Status(int attack, int defend, int hp) { this.attack = attack; this.defend = defend; this.hp = hp; } /** * 保存 */ public Save save() { return new Save(attack, defend, hp); } /** * 载入存档 */ public void load(Save save) { this.attack = save.attack; this.defend = save.defend; this.hp = save.hp; } @Override public String toString() { return "Status{" + "attack=" + attack + ", defend=" + defend + ", hp=" + hp + '}'; } } class SaveManager { Map<Integer, Save> saveMap = new HashMap<>(); public void createSave(Save save) { saveMap.put(saveMap.size() + 1, save); } public Save getSave(int num) { return saveMap.get(num); } } /** * 存档 */ class Save { int attack; int defend; int hp; public Save(int attack, int defend, int hp) { this.attack = attack; this.defend = defend; this.hp = hp; } }
输出:
Status{attack=100, defend=100, hp=100}
Status{attack=0, defend=0, hp=0}
Status{attack=100, defend=100, hp=100}
Status是角色的实时状态,Save是角色在某个瞬间保存下来的状态然后把这个save对象移交给SaveManager管理。
注意:备忘录模式其实是使用额外的空间保存目标对象的“快照”。所以如果目标对象过于庞大,那么在使用备忘录模式之前 须“三思而后行”
plantuml
@startuml class Save{ } Save <.. Status class Status{ save() load() } Save <..* SaveManager class SaveManager{ Map<Integer, Save> saveMap createSave() getSave() } @enduml
相关文章推荐
- 设计模式:18 备忘录模式
- 设计模式(18)------备忘录模式
- 设计模式(18)-----备忘录模式
- 18备忘录模式
- 设计模式(18)--备忘录模式
- 设计模式(18)——备忘录 Memento
- JAVA设计模式-18-备忘录模式
- 23种设计模式(18)-备忘录模式
- 设计模式之18 - 备忘录模式Memento
- 设计模式(18) ------------备忘录模式
- 设计模式-18-备忘录模式
- 设计模式(18)-备忘录模式
- 笔记-大话设计模式-18 备忘录模式
- 18-备忘录模式
- 设计模式(18)——Memento(备忘录)
- 《大话设计模式》—— 读后感(18)如果再回到从前——备忘录模式
- 18.备忘录模式
- C++ 18备忘录模式
- 设计模式(18)--备忘录模式
- 大话设计模式18----备忘录模式