golang与java备忘录模式
程序员文章站
2022-03-07 07:53:12
1.定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。2.理解备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如有IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作。3.角色发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘...
1.定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
2.理解
备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如有IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作。
3.角色
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
4.示例
游戏中可以保存进度并恢复进度信息。
- 游戏(Game):发起人
- 游戏存档(GameSaver):备忘录
- 存档管理(GameSaverManager):管理者
5.java代码
public class MementoPattern {
//备忘录模式:游戏存档的回复
public static void main(String[] args) {
Game game = new Game();
GameSaverManager manager = new GameSaverManager();
game.setProcess("玩了30%的进度");
//保存进度
GameSaver gameSaver1 = game.createGameSaver();
manager.addGameSaver("进度1",gameSaver1);
game.setProcess("玩了40%的进度");
GameSaver gameSaver2 = game.createGameSaver();
manager.addGameSaver("进度2",gameSaver2);
System.out.println(game.getProcess());
//恢复之前的进度
game.restoreGameByGameSaer(manager.getGameSaverByName("进度1"));
System.out.println(game.getProcess());
}
}
//发起者
@Data
class Game{
//游戏进度
private String process;
public void restoreGameByGameSaer(GameSaver gameSaver){
this.setProcess(gameSaver.getProcess());
}
public GameSaver createGameSaver(){
GameSaver gameSaver = new GameSaver();
gameSaver.setProcess(this.getProcess());
return gameSaver;
}
}
//备忘录
@Data
class GameSaver{
//游戏进度
private String process;
}
//管理者
class GameSaverManager{
private Map<String,GameSaver> gameSaverMap = new HashMap<String, GameSaver>();
public GameSaver getGameSaverByName(String key){
return gameSaverMap.get(key);
}
public void addGameSaver(String key,GameSaver gameSaver){
gameSaverMap.put(key,gameSaver);
}
}
6.golang代码
func main() {
//初始化
game := new(Game)
manager := NewGameManager()
game.Process="玩了30%的进度"
//保存进度信息
save1:= game.CreateGameSaver()
manager.AddGameSaver("进度1",save1)
game.Process="玩了40%的进度"
fmt.Println(game.Process)
//恢复之前的存档
game.RestoreGame(manager.GetGameSaverByKey("进度1"))
fmt.Println(game.Process)
}
//游戏,发起人
type Game struct {
Process string
}
func (game *Game) RestoreGame(gameSaver *GameSaver) {
game.Process = gameSaver.Process
}
func (game *Game) CreateGameSaver() *GameSaver {
gameSaver := new(GameSaver)
gameSaver.Process = game.Process
return gameSaver
}
//游戏存档-备忘录
type GameSaver struct {
Process string
}
//游戏存档管理者
type GameManager struct {
gameSavers map[string]*GameSaver
}
func (m *GameManager) AddGameSaver(key string,saver *GameSaver) {
m.gameSavers[key] = saver
}
func (m *GameManager) GetGameSaverByKey(key string) *GameSaver {
return m.gameSavers[key]
}
func NewGameManager() *GameManager {
manager := new(GameManager)
manager.gameSavers = make(map[string]*GameSaver)
return manager
}
本文地址:https://blog.csdn.net/m0_37681974/article/details/108572528