• 设计模式与应用:备忘录模式


    简介

    备忘录模式:Memento模式

    行为模式之一

    作用:保存对象的内部状态,并在需要的时候(undo、rollback)恢复对象以前的状态

    应用场景

    如果一个对象需要保存状态并想通过undo或roback等操作,恢复到以前的状态时可以使用

    具体使用

    • 游戏存档

    应用注意

    • 备忘录可以有多份,这个可以调整备忘录管理者的结构即可(改成List)
    • 备忘录保存的状态,是一份数据,如下示例只是用String来代替,理论上它可以是任何结构数据,注意与Originator角色解耦

    角色关系

    • Originator:原始对象。运行着的原始的对象数据
    • Memento:备忘录。用来保存原始对象数据
    • Caretaker:备忘录管理者。用来操作备忘录:保存、恢复

    结构图

    在这里插入图片描述

    代码实现

    • 角色:Originator
    /**
     * 角色:Originator 原生者 需要被保存状态以便恢复的那个对象
     */
    public class Originator {
    
        private String state;
    
        public Originator() {}
    
        public Originator(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        public void rollbackFromMemento(Memento memento){
            this.state = memento.getState();
        }
    
        public Memento createMemento(){
            return new Memento(this.state);
        }
    
        @Override
        public String toString() {
            return "Originator{state='" + state + '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 角色:备忘录 memento
    /**
     * 备忘录 该对象由Originator创建,主要用来保存Originator的内部状态
     */
    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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 角色:备忘录管理者 Caretaker
    /**
     * 备忘录管理者 负责保存、恢复Originator
     */
    public class Caretaker {
    
        private Memento memento;
    
        public Caretaker() {}
    
        public Caretaker(Memento memento) {
            this.memento = memento;
        }
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 测试
    /**
     * 测试使用
     */
    public class ClientTest {
    
        public static void main(String[] args) {
            Originator originator = new Originator("北京");
            System.out.println(originator);
    
            // 保存状态:备忘录管理者创建备忘录
            Caretaker caretaker = new Caretaker();
            caretaker.setMemento(originator.createMemento());
    
            // 原state数据继续变化
            originator.setState("上海");
            System.out.println(originator);
    
            // 恢复状态:备忘录恢复
            originator.rollbackFromMemento(caretaker.getMemento());
            System.out.println(originator);
    
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 测试输出
    Originator{state='北京}
    Originator{state='上海}
    Originator{state='北京}
    
    • 1
    • 2
    • 3
  • 相关阅读:
    【KVM虚拟化】· 存储池、存储卷
    想过为什么家里的IP是192.168开头的吗?
    FlinkSQL开发经验分享
    VisualStudio使用 props文件的一个坑
    SSH 免密登录:普通用户免密配置登录仍需输入密码
    diffusers-Tasks
    网络原理之TCP_IP
    喜讯!云起无垠入选《2023年中国AIGC创新企业榜》
    手把手教你用 Jenkins 自动部署 SpringBoot
    概率统计面试题
  • 原文地址:https://blog.csdn.net/maoyuanming0806/article/details/125508941