備忘錄對(duì)象是一個(gè)用來(lái)存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照的對(duì)象。備忘錄模式的用意是在不破壞封裝的條件下,將一個(gè)對(duì)象的狀態(tài)捕捉(Capture)住,并外部化,存儲(chǔ)起來(lái),從而可以在將來(lái)合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)起來(lái)的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。

備忘錄模式所涉及的角色有三個(gè):備忘錄(Memento)角色、發(fā)起人(Originator)角色、負(fù)責(zé)人(Caretaker)角色。
發(fā)起人角色類,發(fā)起人角色利用一個(gè)新創(chuàng)建的備忘錄對(duì)象將自己的內(nèi)部狀態(tài)存儲(chǔ)起來(lái)。
public class Originator { PRivate String state; /** * 工廠方法,返回一個(gè)新的備忘錄對(duì)象 */ public Memento createMemento(){ return new Memento(state); } /** * 將發(fā)起人恢復(fù)到備忘錄對(duì)象所記載的狀態(tài) */ public void restoreMemento(Memento memento){ this.state = memento.getState(); } public String getState() { return state; } public void setState(String state) { this.state = state; System.out.println("當(dāng)前狀態(tài):" + this.state); }}備忘錄角色類,備忘錄對(duì)象將發(fā)起人對(duì)象傳入的狀態(tài)存儲(chǔ)起來(lái)。
public class Memento { private String state; public Memento(String state){ this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; }}負(fù)責(zé)人角色類,負(fù)責(zé)人角色負(fù)責(zé)保存?zhèn)渫泴?duì)象,但是從不修改(甚至不查看)備忘錄對(duì)象的內(nèi)容。
public class Caretaker { private Memento memento; /** * 備忘錄的取值方法 */ public Memento retrieveMemento(){ return this.memento; } /** * 備忘錄的賦值方法 */ public void saveMemento(Memento memento){ this.memento = memento; }}客戶端角色類
public class Client { public static void main(String[] args) { Originator o = new Originator(); Caretaker c = new Caretaker(); //改變負(fù)責(zé)人對(duì)象的狀態(tài) o.setState("On"); //創(chuàng)建備忘錄對(duì)象,并將發(fā)起人對(duì)象的狀態(tài)儲(chǔ)存起來(lái) c.saveMemento(o.createMemento()); //修改發(fā)起人的狀態(tài) o.setState("Off"); //恢復(fù)發(fā)起人對(duì)象的狀態(tài) o.restoreMemento(c.retrieveMemento()); System.out.println(o.getState()); }}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注