【设计模式】备忘录模式

star2017 1年前 ⋅ 840 阅读

简介

保存一个对象的状态,以便在需要的时候来恢复它,可以理解为回滚,备忘录主要将其内部状态保存为memento对象,再从memento对象恢复到以前的状态,该模式属于行为型。

适用场景

1、保存及恢复数据相关业务场景
2、对象的内部状态应该保存在外部,以便稍后可以将对象恢复到此状态
3、不能违反对象的封装

优点

1、为用户提供一种可恢复机制
2、存档信息的封装

缺点

1、资源占有

代码示例

image.png
游戏类,saveToMemento保存游戏数据到memento对象中,restoreFromMemento从memento对象中恢复数据到game对象中。

public class Game {
    private int level;
    private int progress;
    public Game(int level, int progress) {
        this.level = level;
        this.progress = progress;
    }
    public GameMemento saveToMemento(){
        System.out.println("当前等级到"+level+",当前进度:"+progress);
        return new GameMemento(level,progress);
    }
    public void restoreFromMemento(GameMemento gameMemento){
        this.level = gameMemento.getLevel();
        this.progress = gameMemento.getProgress();
        System.out.println("恢复等级到"+this.level+",恢复进度:"+this.progress);
    }
}

游戏备忘录类

public class GameMemento {
    private int level;
    private int progress;
    public GameMemento(int level, int progress) {
        this.level = level;
        this.progress = progress;
    }
    public int getLevel() {
        return level;
    }
    public int getProgress() {
        return progress;
    }
}

游戏管理类

public class GameManage {
    private static Stack<GameMemento> stack = new Stack<>();
    public void addMemento(GameMemento gameMemento){
        stack.push(gameMemento);
    }
    public GameMemento getGameMemento(){
        return stack.pop();
    }
}

测试类

public class MementoTest {
    public static void main(String[] args) {
        Game game = new Game(1,2);
        Game game2 = new Game(2,3);
        GameManage gameManage = new GameManage();
        gameManage.addMemento(game.saveToMemento());
        gameManage.addMemento(game2.saveToMemento());

        game.restoreFromMemento(gameManage.getGameMemento());
        game2.restoreFromMemento(gameManage.getGameMemento());
    }
}

输出结果为:

当前等级到1,当前进度:2
当前等级到2,当前进度:3
恢复等级到2,恢复进度:3
恢复等级到1,恢复进度:2

上面示例源码

源码分析

spring中应用

在webflow包下,StateManageableMessageContext中使用了备忘录模式,
image.png
DefaultMessageContextStateManageableMessageContext的子类,
image.png
image.png

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: