美文网首页
备忘录模式(Memento)

备忘录模式(Memento)

作者: jiahzhon | 来源:发表于2020-03-10 17:45 被阅读0次

    - 定义

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

    • 缺点:
      资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

    - 主要角色

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

    - 结构图

    3-1Q119130413927.gif

    - 代码实现

    package memento;
    public class MementoPattern
    {
        public static void main(String[] args)
        {
            Originator or=new Originator();
            Caretaker cr=new Caretaker();       
            or.setState("S0"); 
            System.out.println("初始状态:"+or.getState());           
            cr.setMemento(or.createMemento()); //保存状态      
            or.setState("S1"); 
            System.out.println("新的状态:"+or.getState());        
            or.restoreMemento(cr.getMemento()); //恢复状态
            System.out.println("恢复状态:"+or.getState());
        }
    }
    //备忘录
    class Memento
    { 
        private String state; 
        public Memento(String state)
        { 
            this.state=state; 
        }     
        public void setState(String state)
        { 
            this.state=state; 
        }
        public String getState()
        { 
            return state; 
        }
    }
    //发起人
    class Originator
    { 
        private String state;     
        public void setState(String state)
        { 
            this.state=state; 
        }
        public String getState()
        { 
            return state; 
        }
        public Memento createMemento()
        { 
            return new Memento(state); 
        } 
        public void restoreMemento(Memento m)
        { 
            this.setState(m.getState()); 
        } 
    }
    //管理者
    class Caretaker
    { 
        private Memento memento;       
        public void setMemento(Memento m)
        { 
            memento=m; 
        }
        public Memento getMemento()
        { 
            return memento; 
        }
    }
    

    例子:游戏步数
    第一次前进了10步,第二次前进时踩到便便了,然后要回到之前的进度。例如下图结构:


    772743-20180909143948342-775978644.png
    • 游戏类-发起人
    /**
     * 游戏
     */
    @Data
    public class Game {
    
        /**
         * 玩家走的步数
         */
        private int playerStep;
    
        /**
         * 备份游戏
         * @return
         */
        public GameMemento createGameMemento(){
            return new GameMemento(playerStep);
        }
    
        /**
         * 开始玩游戏
         */
        public void play(){
            playerStep = 0;
        }
    
        /**
         * 恢复备份
         * @param gameMemento
         */
        public void restore(GameMemento gameMemento){
            this.playerStep = gameMemento.getPlayerSteps();
        }
    }
    
    • 备份
    /**
     * 备份
     */
    @Getter
    public class GameMemento {
        /** 步数 */
        private int playerSteps;
    
        /**
         * 备份步数
         * @param playerSteps
         */
        public GameMemento(int playerSteps){
            this.playerSteps = playerSteps;
        }
    
    }
    
    • 备份信息管理类
    /**
     * 备份信息管理类
     */
    public class Caretaker {
        /** 备份 */
        private GameMemento gameMemento;
        /** 恢复备份 */
        public GameMemento retrieveMemento(){
            return this.gameMemento;
        }
        /** 保存备份 */
        public void saveMemento(GameMemento gameMemento){
            this.gameMemento = gameMemento;
        }
    }
    
    • 测试
    public class Player {
    
        public static void main(String[] args) {
    
            Game game = new Game();
            System.out.println("游戏开始,捡到滑板,前进10步");
            game.setPlayerStep(10);
            //备份当前状态
            System.out.println("备份当前状态");
            GameMemento gameMemento = game.createGameMemento();
    
            Caretaker caretaker = new Caretaker();
    
            caretaker.saveMemento(gameMemento);
            System.out.println("备份完成");
            game.play();
            System.out.println("踩到便便了,当前步数为:"+game.getPlayerStep());
            System.out.println("还原到之前一步");
            game.restore(caretaker.retrieveMemento());
    
            System.out.println("恢复完成,当前玩家步数是:"+game.getPlayerStep());
    
        }
    
    }
    

    打印结果:

    游戏开始,捡到滑板,前进10步
    备份当前状态
    备份完成
    踩到便便了,当前步数为:0
    还原到之前一步
    恢复完成,当前玩家步数是:10
    

    相关文章

      网友评论

          本文标题:备忘录模式(Memento)

          本文链接:https://www.haomeiwen.com/subject/swlgdhtx.html