欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang与java备忘录模式

程序员文章站 2022-06-23 08:29:26
1.定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。2.理解备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如有IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作。3.角色发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘...

1.定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

2.理解

备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如有IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作。

3.角色

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
    golang与java备忘录模式

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);
    }
}

golang与java备忘录模式

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
}

golang与java备忘录模式

本文地址:https://blog.csdn.net/m0_37681974/article/details/108572528