返回顶部
扩大
缩小

Heaton

备忘录模式(二十一)

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

介绍

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

如何解决:通过一个备忘录类专门存储对象状态。

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。

package com.tzytzytzy.Memento.com.ex1;

public class Person {
    private String name;
    private String sex;
    private int age;
    public Person() {
    }
    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void display() {
        System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
    }
}
package com.tzytzytzy.Memento.com.ex1;

public class MainClass {
    public static void main(String[] args) {
        Person per = new Person("战三","男",30);
        //保存内部状态
        Person backup = new Person();
        backup.setName(per.getName());
        backup.setAge(per.getAge());
        backup.setSex(per.getSex());
        
        per.display();
        per.setAge(20);
        per.display();
        
        per.setName(backup.getName());
        per.setSex(backup.getSex());
        per.setAge(backup.getAge());
        per.display();
        
    }
}

 

 

package com.tzytzytzy.Memento.com.ex2;

public class Person {
    private String name;
    private String sex;
    private int age;
    public Person() {
    }
    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    public void display() {
        System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
    }
    
    //创建一个备份
    public Memento createMemento() {
        return new Memento(name,sex,age);
    }
    
    //恢复备份
    public void setMemento(Memento memento) {
        this.name = memento.getName();
        this.sex = memento.getSex();
        this.age =  memento.getAge();
    }
    
}
package com.tzytzytzy.Memento.com.ex2;

/**
* @author Heaton
* @date 2018/5/8 23:20
* @describe 记忆中的状态,备忘
*/
public class Memento {
    private String name;
    private String sex;
    private int age;
    public Memento(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
package com.tzytzytzy.Memento.com.ex2;

/**
* @author Heaton
* @date 2018/5/8 23:28
* @describe 备份管理者
*/
public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
    
}
package com.tzytzytzy.Memento.com.ex2;

public class MainClass {
    public static void main(String[] args) {
        Person per = new Person("张三", "男", 24);

//        Memento memento = per.createMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(per.createMemento());

        per.display();

        per.setName("李四");
        per.setSex("女");
        per.setAge(1);

        per.display();
//      per.setMemento(memento);
        per.setMemento(caretaker.getMemento());
        per.display();

    }
}

 

posted on 2018-05-11 22:59  咘雷扎克  阅读(131)  评论(0编辑  收藏  举报

导航