設計模式 - 19 Memento 備忘錄模式

來源:互聯網
上載者:User


一、什麼是備忘錄模式     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對象的狀態。

五、例子

Person.java

public class Person {                                                                                           private String name;    private String sex;    private int age;    public Person() {}    public Person(String n, String s, int a) {        name = n;        sex = s;        age = a;    }    public String getName() {        return name;    }    public void setName(String n) {        name = n;    }    public String getSex() {        return sex;    }    public void setSex(String s) {        sex = s;    }    public int getAge() {        return age;    }    public void setAge(int a) {        age = a;    }    public void display() {        System.out.println("name: " + name + ", sex: " + sex + ", age: " + age);    }    // Creage a memento    public Memento createMemento() {        return new Memento(name, sex, age);    }    // Restore    public void setMemento(Memento memento) {        name = memento.getName();        sex = memento.getSex();        age = memento.getAge();    }}       

Memento.java

public class Memento extends Person {    private String name;    private String sex;    private int age;    public Memento(String n, String s, int a) {        super(n, s, a);                                                                                         }}

Caretaker.java

public class Caretaker {    private Memento memento;    public Memento getMemento() {        return memento;    }    public void setMemento(Memento m) {                                                                             memento = m;    }}

MainClass.java

public class MainClass {    public static void main(String[] args) {        Person p = new Person("Jim", "Male", 23);        Caretaker caretaker = new Caretaker();        //Memento m = p.createMemento();        caretaker.setMemento(p.createMemento());        //System.out.println(m.getName());                                                                          p.display();        p.setName("John");        p.setAge(20);        p.display();        p.setMemento(caretaker.getMemento());        p.display();    }}

output:





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.