zoukankan      html  css  js  c++  java
  • 设计模式 |备忘录模式(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]

    总结:

    备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
    这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。
  • 相关阅读:
    Java之JVM调优案例分析与实战(4)
    Qt浅谈之四十九俄罗斯方块(代码来自网络)
    自作聪明的开发
    Visual Studio 连接 SQL Server 的connectionStringz和
    删除反复行SQL举例
    一起学android之怎样设置TextView中不同字段的字体颜色(22)
    A008-drawable资源
    android 自己定义组件随着手指自己主动画圆
    一个简单的HTML5摇一摇实例
    关于事件的传递机制。
  • 原文地址:https://www.cnblogs.com/imoqian/p/10970138.html
Copyright © 2011-2022 走看看