微信扫一扫打赏支持

北风设计模式课程---26、备忘录模式

北风设计模式课程---26、备忘录模式

一、总结

一句话总结:

备忘者模式 人如其名,就是为了备忘,好恢复状态。最直观的例子就是游戏通关的备份。所以最核心的方法自然也是设置状态和回滚,当然这两个方法都在 Originator角色中

 

1、什么是备忘录模式?

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


Memento模式也叫备忘录模式,是行为模式之
一,它的作用是保存对象的内部状态,并在需要
的时候(undo/rollback)恢复对象以前的状态。

 

2、备忘录模式的应用场景?

需要保存状态并且恢复状态的时候,比如游戏中的闯关保存记录


如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

 

3、备忘录模式的角色和职责?

Originator(原生者):需要被保存状态以便恢复的那个对象。:Person.java
Memento(备忘录):该对象由Originator创建,主要用来保存Originator的内部状态。:Memento.java
Caretaker(管理者):负责在适当的时间保存/恢复Originator对象的状态。:Caretaker.java

 

4、备忘录模式中 Caretaker(管理者) 存在的意义是什么?

单一职责:保证每个类单一职责:让Memento角色只需做存储记录这样的职责,管理Memento的功能就交给管理者吧

 

5、备忘录模式的原理和流程是怎样的?

通过备忘者角色来实现备忘:原生者角色里面有 存储和回滚方法,存储就是将信息存到备忘者角色里面去,回滚就是用备忘者角色的信息回滚当前角色。

 

6、原生者角色和备忘录角色之间的共同点?

备忘录角色和原生者角色的属性相同:因为这是备忘录角色方便存储原生者角色的信息。

 

 

 

 

二、内容在总结中

1、相关知识

Originator(原生者):需要被保存状态以便恢复的那个对象。:Person.java
Memento(备忘录):该对象由Originator创建,主要用来保存Originator的内部状态。:Memento.java
Caretaker(管理者):负责在适当的时间保存/恢复Originator对象的状态。:Caretaker.java
客户端调用:MainClass.java

 

2、代码

Originator(原生者):需要被保存状态以便恢复的那个对象。:Person.java

package com.ibeifeng.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();
    }
    
}

 

Memento(备忘录):该对象由Originator创建,主要用来保存Originator的内部状态。:Memento.java

package com.ibeifeng.ex2;

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;
    }

}

 

 

Caretaker(管理者):负责在适当的时间保存/恢复Originator对象的状态。:Caretaker.java

package com.ibeifeng.ex2;

public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
    
}

 

 

客户端调用:MainClass.java

package com.ibeifeng.ex2;

public class MainClass {
    public static void main(String[] args) {
        Person per = new Person("lifengxing","ÄÐ",24);
        
//        Memento memento = per.createMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(per.createMemento());
        
        per.display();
        
        per.setName("beifeng");
        per.setSex("Å®");
        per.setAge(1);
        
        per.display();
        
        per.setMemento(caretaker.getMemento());
        per.display();
        
    }
}

 

 

 

 

 
posted @ 2019-07-01 14:45  范仁义  阅读(144)  评论(0编辑  收藏  举报