設計模式 |備忘錄模式(memento)

定義:

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就能夠將該對象恢復到原先保存的狀態。

結構:(書中圖,侵刪)

 

Originator:須要備份的類(寫在便籤上的內容)
Memento:備份類,裏面包含部分或所有Originator的屬性(便籤紙)
Caretaker:真正保存備份的地方(便籤紙貼的地方)

實例:

替答到。我也不知道怎麼就想到了這個。上課的時候,老師點名,若是你要幫同窗答到,那麼你就須要先將本身的名字藏起來,換成你同窗的名字,等替他答完了,你再換回本身名字。(我並無在教壞小朋友,還請同窗們乖乖本身去上課)
 
學生類:
package designpattern.memento;

public class Student {
    private String name;// 姓名
    private String major;// 專業
    private String studentNo;// 學號

    public Student(String name, String major, String studentNo) {
        super();
        this.name = name;
        this.major = major;
        this.studentNo = studentNo;
    }

    public Memento createMemento() {
        return new Memento(this.name, this.major);
    }

    public void restoreMemento(Memento memento) {
        this.name = memento.getName();
        this.major = memento.getMajor();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", major=" + major + ", studentNo=" + studentNo + "]";
    }

}
備忘錄類:
package designpattern.memento;

public class Memento {
    private String name;
    private String major;

    public Memento(String name, String major) {
        super();
        this.name = name;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

}
保存類:
package designpattern.memento;

public class CareTaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

}
客戶端:
package designpattern.memento;

public class Client {
    public static void main(String[] args) {
        Student student = new Student("郝鑫仁", "計算機", "1234");
        CareTaker careTaker = new CareTaker();
        careTaker.setMemento(student.createMemento());
        System.out.println(student);

        System.out.println("開始點名...");

        // 假裝成其餘同窗
        student.setName("齊步萊");
        student.setMajor("自動化");
        System.out.println(student);

        System.out.println("點名結束");

        // 變回本身
        student.restoreMemento(careTaker.getMemento());
        System.out.println(student);

    }
}
結果輸出:
Student [name=郝鑫仁, major=計算機, studentNo=1234]
開始點名...
Student [name=齊步萊, major=自動化, studentNo=1234]
點名結束
Student [name=郝鑫仁, major=計算機, studentNo=1234]

總結:

備忘錄模式就是用於臨時存儲類的一部分信息,以便它能回到存儲前的狀態。
這個我在實際應用中暫時沒有遇到相關的實例,書中說到的保存遊戲進度算一個,但我本身開發中暫時還沒遇到。
相關文章
相關標籤/搜索