模式定义
Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.
在不违反封装的情况下,捕获并外部化对象的内部状态,以便以后可以将对象恢复到该状态。
模式结构
模式实现
1.定义游戏状态类
package com.example.designpattern.memento.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class GameState {
private int exp;
private int level;
public GameMemento save() {
return new GameMemento(exp, level);
}
public void restore(GameMemento gameMemento) {
exp = gameMemento.getExp();
level = gameMemento.getLevel();
}
}
2.定义游戏存档类
package com.example.designpattern.memento.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class GameMemento {
private int exp;
private int level;
}
3.定义游戏存档管理接口
package com.example.designpattern.memento.manager;
import com.example.designpattern.memento.domain.GameMemento;
public interface GameSaveManger {
void addSave(GameMemento memento);
GameMemento getSave(int index);
}
4.实现游戏存档管理接口
package com.example.designpattern.memento.manager.impl;
import com.example.designpattern.memento.domain.GameMemento;
import com.example.designpattern.memento.manager.GameSaveManger;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component("gameSaveManger")
public class GameSaveMangerImpl implements GameSaveManger {
private final List saves = new ArrayList<>();
@Override
public void addSave(GameMemento memento) {
saves.add(memento);
}
@Override
public GameMemento getSave(int index) {
return saves.get(index);
}
}
5.测试
package com.example.designpattern.memento;
import com.example.designpattern.memento.domain.GameState;
import com.example.designpattern.memento.manager.GameSaveManger;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@SpringBootTest
public class DesignPatternTest {
@Resource(name = "gameSaveManger")
private GameSaveManger gameSaveManger;
@Test
public void test() {
// 开始游戏
GameState gameState = new GameState(1, 1);
// 存档游戏
gameSaveManger.addSave(gameState.save());
// 玩游戏
gameState.setExp(2);
gameState.setLevel(2);
// 加载存档
gameState.restore(gameSaveManger.getSave(0));
System.out.println(gameState);
}
}
可以看到,游戏是可以正常会退到存档的内容的
回顾
本文通过游戏的存档、回退存档,抽象出与符合的设计模式——备忘录模式。同时,与传统Java的说教不同,本次的实现基于企业开发必用的Spring框架,贴近实际开发场景。
不过备忘录模式在实际开发中的应用并不多,很少有数据存储在服务器容器运行的内存中,而是会将数据存储到专门的数据库中,如磁盘型数据库MySQL,内存型数据库Redis等。