1 public class Client { 2 private static Originator o = new Originator(); 3 private static Caretaker c = new Caretaker(); 4 public static void main(String[] args) { 5 //改變發起人的對象狀態 6 o.setState("On"); 7 //建立備忘錄對象,並將發起人對象的狀態存儲起來 8 c.saveMemento(o.createMemento()); 9 //修改發起人對象的狀態 10 o.setState("Off"); 11 //恢復發起人的對象狀態 12 o.restoreMemento(c.retrieveMemento()); 13 System.out.println(o.getSate()); 14 } 15 } 16 //發起人角色,它用一個新建立的備忘錄對象將本身的內部狀態存儲起來 17 class Originator{ 18 private String state; 19 //工廠方法,返還一個新的備忘錄對象 20 public Memento createMemento(){ 21 return new Memento(state); 22 } 23 //將發起人恢復到備忘錄對象所記載的狀態 24 public void restoreMemento(Memento memento){ 25 this.state = memento.getState(); 26 } 27 //狀態的取值方法 28 public String getSate(){ 29 return this.state; 30 } 31 //狀態的賦值方法 32 public void setState(String state){ 33 this.state = state; 34 System.out.println("Current state =" + this.state); 35 } 36 } 37 38 //備忘錄角色,它將發起人對象傳入的狀態存儲起來,它會根據發起人對象的判斷來決定將發起人的內部狀態的多少存儲起來 39 class Memento{ 40 private String state; 41 //構造子 42 public Memento(String state){ 43 this.state = state; 44 } 45 //狀態取值方法 46 public String getState(){ 47 return this.state; 48 } 49 //狀態的賦值方法 50 public void setState(String state){ 51 this.state = state; 52 } 53 } 54 //負責人角色,它負責保存備忘錄對象,但不修改備忘錄對象內容(一個更好實現是負責人對象根本沒法從備忘錄對象中讀取和修改其內容) 55 class Caretaker{ 56 private Memento memento; 57 //備忘錄的取值方法 58 public Memento retrieveMemento(){ 59 return this.memento; 60 } 61 //備忘錄的賦值方法 62 public void saveMemento(Memento memento){ 63 this.memento = memento; 64 } 65 }
1 public class Client { 2 private static Originator o = new Originator(); 3 private static Caretaker c = new Caretaker(); 4 public static void main(String[] args) { 5 //改變發起人的對象狀態 6 o.setState("On"); 7 //建立備忘錄對象,並將發起人對象的狀態存儲起來 8 c.saveMemento(o.createMemento()); 9 //修改發起人對象的狀態 10 o.setState("Off"); 11 //恢復發起人的對象狀態 12 o.restoreMemento(c.retriveMemento()); 13 System.out.println(o.getState()); 14 } 15 } 16 //發起人角色,在此類中定義了一個內部的Memento類,因爲此類的全部方法都是私有的,所以只有它本身和發起人(Originator)類能夠調用 17 class Originator{ 18 private String state; 19 //構造 20 public Originator(){} 21 //工廠方法,返還一個新的備忘錄對象 22 public MementoIF createMemento(){ 23 return new Memento(this.state); 24 } 25 //將發想人恢復到備忘錄對象記錄的狀態 26 public void restoreMemento(MementoIF memento){ 27 Memento aMemento = (Memento)memento; 28 this.setState(aMemento.getState()); 29 } 30 //狀態的取值方法 31 public String getState(){ 32 return this.state; 33 } 34 //狀態的賦值方法 35 public void setState(String state){ 36 this.state = state; 37 System.out.println("state ="+ state); 38 } 39 //內部成員類,備忘錄 40 protected class Memento implements MementoIF{ 41 private String savedState; 42 //構造 43 private Memento(String someState){ 44 savedState = someState; 45 } 46 //狀態賦值方法 47 private void setState(String someState){ 48 savedState = someState; 49 } 50 //狀態取值方法 51 private String getState(){ 52 return savedState; 53 } 54 } 55 } 56 57 //MementoIF角色只是一個標識接口,它就是窄接口,因爲它是一個標識接口,因此負責人不可能改變這個備忘錄對象 的內容 58 interface MementoIF{} 59 60 //負責人角色 61 class Caretaker{ 62 private MementoIF memento; 63 //備忘錄的取值方法 64 public MementoIF retriveMemento(){ 65 return this.memento; 66 } 67 //備忘錄的賦值方法 68 public void saveMemento(MementoIF memento){ 69 this.memento = memento; 70 } 71 }