一句话总结
你保管好我不定时分出来的分身们 , 方便我的灵魂来回切换
- 你保管
说明是保存在对象之外的 (另外找一个类)
//创建看管角色对象的类
class Caretaker {
//维护一个保存游戏角色当前状态的集合
Map<String, GameRole> memento;
public Caretaker() {
memento = new HashMap<>();//创建时初始化集合
}
//添加一个角色(状态)
public void add(GameRole gameRole){
memento.put(gameRole.getName(),gameRole);
}
//获取摸个角色最近保存的状态,参数直接传入角色就可以
public GameRole getGameRole(GameRole gameRole) {
if (memento.containsKey(gameRole.getName())) {
return memento.get(gameRole.getName());//如果存在就获取
} else {
throw new RuntimeException("没有该角色的状态!");//不然抛异常
}
}
}
- 不定时分出来的分身们
说明我保存的状态是一个集合 (为啥是map一会说) 而且还会提供一个方法复制出一个分身
//维护一个保存游戏角色当前状态的集合
Map<String, GameRole> memento;
public Caretaker() {
memento = new HashMap<>();//创建时初始化集合
}
- 分身
第一反应就是原型模式
/*
* 原型模式
* 这个方法就是算是原型模式
* 我是使用的序列化和反序列化的方式
* 也可以使用继承Cloneable接口来实现
* 由于使用的是序列化,直接就是深拷贝,相比较继承Cloneable接口来说比较方便
* */
private GameRole cloneGameRole() {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
GameRole gameRole = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(this);
bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
gameRole = (Gam