GOF23設計模式之備忘錄模式(memento)

1、備忘錄模式概述

  保存某個對象內部狀態的拷貝,使得之後就能夠將該對象恢復到原先的狀態。數據庫

  結構:測試

    (1)源發器類 Originatorthis

        負責建立一個備忘錄 Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。spa

    (2)備忘錄類 Mementocode

        負責存儲 Originator 對象的內部狀態,並可防止 Originator 之外的其餘對象訪問備忘錄 Memento 。對象

    (3)負責人類 CareTakeblog

        負責保存備忘錄 Memento 。遊戲

2、備忘錄模式示例代碼

 1 /**
 2  * 備忘錄類
 3  * @author CL
 4  *
 5  */
 6 public class EmpMemento {
 7     private String name;
 8     private int age;
 9     private double salary;
10     
11     public EmpMemento(Employee emp) {
12         this.name = emp.getName();
13         this.age = emp.getAge();
14         this.salary = emp.getSalary();
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     public double getSalary() {
34         return salary;
35     }
36 
37     public void setSalary(double salary) {
38         this.salary = salary;
39     }
40     
41 }
 1 /**
 2  * 源發器類
 3  * @author CL
 4  *
 5  */
 6 public class Employee {
 7     private String name;
 8     private int age;
 9     private double salary;
10     
11     public Employee(String name, int age, double salary) {
12         this.name = name;
13         this.age = age;
14         this.salary = salary;
15     }
16     
17     /**
18      * 進行備忘操做,並返回備忘錄對象
19      * @return
20      */
21     public EmpMemento memento() {
22         return new EmpMemento(this);
23     }
24     
25     /**
26      * 進行數據恢復,恢復成指定備忘錄對象的值
27      */
28     public void recovery(EmpMemento emt) {
29         this.name = emt.getName();
30         this.age = emt.getAge();
31         this.salary = emt.getSalary();
32     }
33     
34     public String getName() {
35         return name;
36     }
37     
38     public void setName(String name) {
39         this.name = name;
40     }
41     
42     public int getAge() {
43         return age;
44     }
45     public void setAge(int age) {
46         this.age = age;
47     }
48     
49     public double getSalary() {
50         return salary;
51     }
52     
53     public void setSalary(double salary) {
54         this.salary = salary;
55     }
56     
57 }
 1 /**
 2  * 負責人類
 3  * @author CL
 4  *
 5  */
 6 public class CareTaker {
 7 
 8     private EmpMemento memento;
 9 
10     //能夠經過容器,增長多個備忘點
11 //    private List<EmpMemento> list = new ArrayList<EmpMemento>();
12     
13     public EmpMemento getMemento() {
14         return memento;
15     }
16 
17     public void setMemento(EmpMemento memento) {
18         this.memento = memento;
19     }
20     
21 }

  測試:事務

 1 /**
 2  * 測試備忘錄模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         CareTaker ct = new CareTaker();
10         
11         Employee emp = new Employee("曹磊", 23, 8000);
12         System.out.println("第一次打印對象:"+emp.getName()+"---"+emp.getAge()
13                 +"---"+emp.getSalary());
14         
15         //備忘一次
16         ct.setMemento(emp.memento());
17         
18         //修改源發器類的值
19         emp.setName("Tom");
20         emp.setAge(99);
21         emp.setSalary(123456);
22         
23         System.out.println("第二次打印對象:"+emp.getName()+"---"+emp.getAge()
24                 +"---"+emp.getSalary());
25         
26         //恢復到備忘錄對象保存的狀態
27         emp.recovery(ct.getMemento());
28         
29         System.out.println("第三次打印對象:"+emp.getName()+"---"+emp.getAge()
30                 +"---"+emp.getSalary());
31         
32     }
33 }

  控制檯輸出:開發

第一次打印對象:曹磊---23---8000.0
第二次打印對象:Tom---99---123456.0
第三次打印對象:曹磊---23---8000.0

  注意:本例子中只設置了一個備忘點,當經過容器設置多個備忘點時,就能夠實現 Word 中 Ctrl + Z 和 Ctrl + Y 的操做。

3、備忘錄模式常見開發應用場景

  (1)棋類遊戲中的悔棋操做;

  (2)Office 中的撤銷、恢復功能;

  (3)數據庫軟件中事務管理的回滾操做;

  (4)Photoshop 軟件中的歷史記錄;

  (5)…………

相關文章
相關標籤/搜索