zoukankan      html  css  js  c++  java
  • 设计模式-备忘录模式

    什么叫备忘录?两个字,回滚。备忘录模式可以记录一个对象的内部状态,当需要的时候可以将对象恢复到之前的状态

    备忘录模式有三个角色:发起者,备忘录,管理者。简而言之,发起者对对象发生改动的时候自己备份一份备忘录交给管理者。每次发起者需要恢复数据的时候找管理者,管理者找出备忘录的数据交给发起者。

    发起者只负责更改的时候备份一份然后交给管理者,发起者可以访问备忘录的所有信息。管理者对发起者创建的备忘录进行管理,只有保存和查看的权限,无法对备忘录进行修改。

    发起者

    public class Originator {
        private String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
        public Memento createMemento(){
            return new Memento(state);
        }
        public void restoreMemento(Memento m){
            this.setState(m.getState());
        }
    }

    备忘录

    public class Memento {
        private String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    }

    管理者

    public class manager {
        private Memento memento;
        public void setMemento(Memento m){
            this.memento=m;
        }
        public Memento  getMemento(){
            return memento;
        }
    }

    测试类

    public class Client {
        public static void main(String[] args) {
            //发起人
            Originator or = new Originator();
            //管理者
            manager manager = new manager();
            or.setState("状态A");
            manager.setMemento(or.createMemento());
            or.setState("状态B");
            or.restoreMemento(manager.getMemento());
            System.out.println(or.getState());
        }
    }

    可以看出,管理者只是协助发起者管理备忘录的一个类,他在发起者需要恢复状态的时候获取备忘录交给请求者。简而言之,管理者就是一个替老板拿钱包的,在老板需要掏钱的时候把钱包提给老板。

    应用场景:游戏中的存档啊,事务的回滚啊,文档的撤销等等

    不和别人一样,不复制只真正理解
  • 相关阅读:
    外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)
    floyd算法----牛栏
    bfs开始--马的遍历
    (DP 线性DP 递推) leetcode 64. Minimum Path Sum
    (DP 线性DP 递推) leetcode 63. Unique Paths II
    (DP 线性DP 递推) leetcode 62. Unique Paths
    (DP 背包) leetcode 198. House Robber
    (贪心 复习) leetcode 1007. Minimum Domino Rotations For Equal Row
    (贪心) leetcode 452. Minimum Number of Arrows to Burst Balloons
    (字符串 栈) leetcode 921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12795640.html
Copyright © 2011-2022 走看看