设计模式
----Memento(
备忘录
)
模式
GoF
:
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
Memento模式是用一个Memento对象来存储另外一个对象的内部状态(前提条件是不破坏封装),将一个对象的状态捕捉住,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代器模式一同使用。
在Memento模式中三个角色都很关键:
Memento(备忘录):备忘录存储原发器的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止 原发器以外的其他对象访问备忘录。
Originator(原发器):创建一个备忘录,用以记录当前时刻他的内部状态;使用备忘录恢复内部状态。
Caretaker(负责人):负责保存好备忘录。不能对备忘录的内容进行操作或检查。
下面给出一个事例代码(来自《Java与模式》):
package
Memento;
public class Memento
... {
private String state;
/** *//** Creates a new instance of Memento */
public Memento(String state)
...{
this.state = state;
}//end Memento(...)
public String getState()
...{
return state;
}//end getState()
public void setState(String state)
...{
this.state = state;
}//end setState(...)
} // end class Memento
package Memento;
public class Originator
... {
private String state;
/** *//** Creates a new instance of Originator */
public Originator() ...{
}//end Originator()
public Memento createMemento()
...{
return new Memento(state);
}//end createMemento()
public void restoreMemento(Memento memento)
...{
state = memento.getState();
}//end restoreMemento(...)
public String getState()
...{
return state;
}//end getState()
public void setState(String state)
...{
this.state = state;
System.out.println("Current state = " + this.state);
}//end setState(...)
}
package Memento;
public class Caretaker
... {
private Memento memento;
/** *//** Creates a new instance of Caretaker */
public Caretaker() ...{
}//end Caretaker()
public Memento retrieveMemento()
...{
return memento;
}//end retrieveMemento()
public void saveMemento(Memento memento)
...{
this.memento = memento;
}//end saveMemento(...)
} // end class Caretaker
看看怎么调用:
package Memento;
public class MementoPattern
... {
private static Originator ori = new Originator();
private static Caretaker car = new Caretaker();
/** *//** Creates a new instance of MementoPattern */
public MementoPattern() ...{
}//end MementoPattern()
public void showMementoPattern()
...{
ori.setState("On");
car.saveMemento(ori.createMemento());
ori.setState("Off");
ori.restoreMemento(car.retrieveMemento());
}//end showMementoPattern()
public static void main(String[] args)
...{
StringBuilder ssb = new StringBuilder();
ssb.append("The Memento Pattern!");
System.out.println(ssb.toString());
MementoPattern mp = new MementoPattern();
mp.showMementoPattern();
}//end main(...)
} // end class MementoPattern
public class Memento
... {
private String state;
/** *//** Creates a new instance of Memento */
public Memento(String state)
...{
this.state = state;
}//end Memento(...)
public String getState()
...{
return state;
}//end getState()
public void setState(String state)
...{
this.state = state;
}//end setState(...)
} // end class Memento
package Memento;
public class Originator
... {
private String state;
/** *//** Creates a new instance of Originator */
public Originator() ...{
}//end Originator()
public Memento createMemento()
...{
return new Memento(state);
}//end createMemento()
public void restoreMemento(Memento memento)
...{
state = memento.getState();
}//end restoreMemento(...)
public String getState()
...{
return state;
}//end getState()
public void setState(String state)
...{
this.state = state;
System.out.println("Current state = " + this.state);
}//end setState(...)
}
package Memento;
public class Caretaker
... {
private Memento memento;
/** *//** Creates a new instance of Caretaker */
public Caretaker() ...{
}//end Caretaker()
public Memento retrieveMemento()
...{
return memento;
}//end retrieveMemento()
public void saveMemento(Memento memento)
...{
this.memento = memento;
}//end saveMemento(...)
} // end class Caretaker
看看怎么调用:
package Memento;
public class MementoPattern
... {
private static Originator ori = new Originator();
private static Caretaker car = new Caretaker();
/** *//** Creates a new instance of MementoPattern */
public MementoPattern() ...{
}//end MementoPattern()
public void showMementoPattern()
...{
ori.setState("On");
car.saveMemento(ori.createMemento());
ori.setState("Off");
ori.restoreMemento(car.retrieveMemento());
}//end showMementoPattern()
public static void main(String[] args)
...{
StringBuilder ssb = new StringBuilder();
ssb.append("The Memento Pattern!");
System.out.println(ssb.toString());
MementoPattern mp = new MementoPattern();
mp.showMementoPattern();
}//end main(...)
} // end class MementoPattern
给出Memento模式的UML图:
小结:
Memento模式还是比较好理解的,在GoF的《设计模式》和《Java与模式》中都讲了比较详细的内容。特别是在《Java与模式》中讲了Memento模式的变种,目前只是学习了解起概念和具体应用就可以了。深入的内容等碰到合适的场景在去理解和运用。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1007600