您的位置:首页 > 其它

大话设计模式学习笔记(18)——备忘录模式

2018-03-26 15:39 127 查看
源码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


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