当前位置: 移动技术网 > IT编程>开发语言>Java > golang与java备忘录模式

golang与java备忘录模式

2020年09月01日  | 移动技术网IT编程  | 我要评论
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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网