21備忘錄模式Memento

1、什麼是備忘錄模式測試

Memento模式也叫備忘錄模式,是行爲模式之 一,它的做用是保存對象的內部狀態,並在須要 的時候(undo/rollback)恢復對象之前的狀態。this

 

2、備忘錄模式的應用場景spa

  若是一個對象須要保存狀態並可經過undo或rollback等 操做恢復到之前的狀態時,能夠使用Memento模式。設計

     1)一個類須要保存它的對象的狀態(至關於Originator角色)code

     2)設計一個類,該類只是用來保存上述對象的狀態(至關於Memento角色) 對象

    3)須要的時候,Caretaker角色要求Originator返回一個Memento並加以保存 blog

    4)undo或rollback操做時,經過Caretaker保存的Memento恢復Originator對象的狀態get

 

3、備忘錄模式的結構class

 

4、備忘錄模式的角色和職責im

  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 }
相關文章
相關標籤/搜索