21备忘录模式Memento

Posted 未来_我来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21备忘录模式Memento相关的知识,希望对你有一定的参考价值。

一、什么是备忘录模式

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

 

二、备忘录模式的应用场景

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

     1)一个类需要保存它的对象的状态(相当于Originator角色)

     2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)

    3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存

    4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

 

三、备忘录模式的结构

 

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

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

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

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

 

没使用备忘录模式时

 1 public class Person {
 2     //姓名
 3     private String name;
 4     //性别
 5     private String sex;
 6     //年龄
 7     private int age;
 8     
 9     public Person() {
10         
11     }
12     
13     public Person(String name, String sex, int age) {
14         this.name = name;
15         this.sex = sex;
16         this.age = age;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public String getSex() {
28         return sex;
29     }
30 
31     public void setSex(String sex) {
32         this.sex = sex;
33     }
34 
35     public int getAge() {
36         return age;
37     }
38 
39     public void setAge(int age) {
40         this.age = age;
41     }
42     
43     public void display() {
44         System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
45     }
46 }

 

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         Person per = new Person("lifengxing","男",30);
 4         
 5         //保存内部状态(备份)
 6         Person backup = new Person();
 7         backup.setName(per.getName());
 8         backup.setAge(per.getAge());
 9         backup.setSex(per.getSex());
10         
11         per.display();
12         
13         //修改
14         per.setAge(20);
15         per.display();
16         
17         //回滚 还原
18         per.setName(backup.getName());
19         per.setSex(backup.getSex());
20         per.setAge(backup.getAge());
21         
22         per.display();
23         
24     }
25 }

 

=======================================================

使用备忘录模式

 1 public class Person {
 2     //姓名
 3     private String name;
 4     //性别
 5     private String sex;
 6     //年龄
 7     private int age;
 8     
 9     public Person() {
10         
11     }
12     
13     public Person(String name, String sex, int age) {
14         this.name = name;
15         this.sex = sex;
16         this.age = age;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public String getSex() {
28         return sex;
29     }
30 
31     public void setSex(String sex) {
32         this.sex = sex;
33     }
34 
35     public int getAge() {
36         return age;
37     }
38 
39     public void setAge(int age) {
40         this.age = age;
41     }
42     
43     public void display() {
44         System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
45     }
46     
47     //创建一个备份
48     public Memento createMemento() {
49         return new Memento(name,sex,age);
50     }
51     
52     //恢复备份,还原
53     public void setMemento(Memento memento) {
54         this.name = memento.getName();
55         this.sex = memento.getSex();
56         this.age =  memento.getAge();
57     }
58 }

备份

 1 //备份
 2 public class Memento {
 3     // 姓名
 4     private String name;
 5     // 性别
 6     private String sex;
 7     // 年龄
 8     private int age;
 9     
10     public Memento(String name, String sex, int age) {
11         this.name = name;
12         this.sex = sex;
13         this.age = age;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public String getSex() {
25         return sex;
26     }
27 
28     public void setSex(String sex) {
29         this.sex = sex;
30     }
31 
32     public int getAge() {
33         return age;
34     }
35 
36     public void setAge(int age) {
37         this.age = age;
38     }
39 }

看守人

 1 //看守人
 2 public class Caretaker {
 3     private Memento memento;
 4 
 5     public Memento getMemento() {
 6         return memento;
 7     }
 8 
 9     public void setMemento(Memento memento) {
10         this.memento = memento;
11     }
12 }

测试

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         Person per = new Person("lifengxing","男",24);
 4         
 5 //        Memento memento = per.createMemento();
 6         Caretaker caretaker = new Caretaker();
 7         caretaker.setMemento(per.createMemento());
 8         
 9         per.display();
10         
11         per.setName("beifeng");
12         per.setSex("女");
13         per.setAge(1);
14         
15         per.display();
16         
17         per.setMemento(caretaker.getMemento());
18         per.display();
19         
20     }
21 }

 

以上是关于21备忘录模式Memento的主要内容,如果未能解决你的问题,请参考以下文章

Memento模式(备忘录设计模式)

设计模式之- 备忘录模式(Memento Pattern)

B9:备忘录模式 Memento

备忘录模式(Memento Pattern)

Memento备忘录模式

GOF23设计模式之备忘录模式(memento)