定義:在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可以將該對象恢復(fù)到原先保存的狀態(tài)。
結(jié)構(gòu):(書中圖,侵刪)
Originator:需要備份的類(寫在便簽上的內(nèi)容)
Memento:備份類,里面包含部分或全部Originator的屬性(便簽紙)
Caretaker:真正保存?zhèn)浞莸牡胤剑ū愫灱堎N的地方)
實(shí)例:替答到。我也不知道怎么就想到了這個。上課的時候,老師點(diǎn)名,如果你要幫同學(xué)答到,那么你就需要先將自己的名字藏起來,換成你同學(xué)的名字,等替他答完了,你再換回自己名字。(我并沒有在教壞小朋友,還請同學(xué)們乖乖自己去上課)
學(xué)生類:
package designpattern.memento; public class Student { private String name;// 姓名 private String major;// 專業(yè) private String studentNo;// 學(xué)號 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("郝鑫仁", "計算機(jī)", "1234"); CareTaker careTaker = new CareTaker(); careTaker.setMemento(student.createMemento()); System.out.println(student); System.out.println("開始點(diǎn)名..."); // 偽裝成其他同學(xué) student.setName("齊步萊"); student.setMajor("自動化"); System.out.println(student); System.out.println("點(diǎn)名結(jié)束"); // 變回自己 student.restoreMemento(careTaker.getMemento()); System.out.println(student); } } 結(jié)果輸出:
Student [name=郝鑫仁, major=計算機(jī), studentNo=1234] 開始點(diǎn)名... Student [name=齊步萊, major=自動化, studentNo=1234] 點(diǎn)名結(jié)束 Student [name=郝鑫仁, major=計算機(jī), studentNo=1234] 總結(jié):備忘錄模式就是用于臨時存儲類的一部分信息,以便它能回到存儲前的狀態(tài)。
這個我在實(shí)際應(yīng)用中暫時沒有遇到相關(guān)的實(shí)例,書中說到的保存游戲進(jìn)度算一個,但我自己開發(fā)中暫時還沒遇到。
|
|
|