版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79699011
源码git地址 https://github.com/dlovetco/designMode
问题提出
玩游戏的时候在打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