• 设计模式 |备忘录模式(memento)


    定义:

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

    结构:(书中图,侵删)

    Originator:需要备份的类(写在便签上的内容)
    Memento:备份类,里面包含部分或全部Originator的属性(便签纸)
    Caretaker:真正保存备份的地方(便签纸贴的地方)

    实例:

    替答到。我也不知道怎么就想到了这个。上课的时候,老师点名,如果你要帮同学答到,那么你就需要先将自己的名字藏起来,换成你同学的名字,等替他答完了,你再换回自己名字。(我并没有在教坏小朋友,还请同学们乖乖自己去上课)
     
    学生类:
    package designpattern.memento;
    
    public class Student {
        private String name;// 姓名
        private String major;// 专业
        private String studentNo;// 学号
    
        public Student(String name, String major, String studentNo) {
            super();
            this.name = name;
            this.major = major;
            this.studentNo = studentNo;
        }
    
        public Memento createMemento() {
            return new Memento(this.name, this.major);
        }
    
        public void restoreMemento(Memento memento) {
            this.name = memento.getName();
            this.major = memento.getMajor();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMajor() {
            return major;
        }
    
        public void setMajor(String major) {
            this.major = major;
        }
    
        public String getStudentNo() {
            return studentNo;
        }
    
        public void setStudentNo(String studentNo) {
            this.studentNo = studentNo;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", major=" + major + ", studentNo=" + studentNo + "]";
        }
    
    }
    备忘录类:
    package designpattern.memento;
    
    public class Memento {
        private String name;
        private String major;
    
        public Memento(String name, String major) {
            super();
            this.name = name;
            this.major = major;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMajor() {
            return major;
        }
    
        public void setMajor(String major) {
            this.major = major;
        }
    
    }
    保存类:
    package designpattern.memento;
    
    public class CareTaker {
        private Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    
    }
    客户端:
    package designpattern.memento;
    
    public class Client {
        public static void main(String[] args) {
            Student student = new Student("郝鑫仁", "计算机", "1234");
            CareTaker careTaker = new CareTaker();
            careTaker.setMemento(student.createMemento());
            System.out.println(student);
    
            System.out.println("开始点名...");
    
            // 伪装成其他同学
            student.setName("齐步莱");
            student.setMajor("自动化");
            System.out.println(student);
    
            System.out.println("点名结束");
    
            // 变回自己
            student.restoreMemento(careTaker.getMemento());
            System.out.println(student);
    
        }
    }
    结果输出:
    Student [name=郝鑫仁, major=计算机, studentNo=1234]
    开始点名...
    Student [name=齐步莱, major=自动化, studentNo=1234]
    点名结束
    Student [name=郝鑫仁, major=计算机, studentNo=1234]

    总结:

    备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
    这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。
  • 相关阅读:
    SpringMVC将表单对象序列化成Json字符串提交,以List接收
    Spring boot下添加filter
    如何将查出的日期Data类型以Json格式输出到前端
    ajax传递给后台数组参数方式
    Spring boot + Gradle + Eclipse打war包发布总结
    Spring-data-jpa详解
    SpringMVC配置过程中出现的问题!
    spring 集成shiro 之 自定义过滤器
    完全跨域的单点登录
    Java8 Lambda表达式
  • 原文地址:https://www.cnblogs.com/imoqian/p/10970138.html
Copyright © 2020-2023  润新知