// ¸Ä±ä״̬
o.setState("state 0");
// ½¨Á¢Ò»¸ö¼ì²éµã
c.createMemento();
// ¸Ä±ä״̬
o.setState("state 1");
// ½¨Á¢Ò»¸ö¼ì²éµã
c.createMemento();
// ¸Ä±ä״̬
o.setState("state 2");
// ½¨Á¢Ò»¸ö¼ì²éµã
c.createMemento();
// ¸Ä±ä״̬
o.setState("state 3");
// ½¨Á¢Ò»¸ö¼ì²éµã
c.createMemento();
// ´òÓ¡³öËùÓмì²éµã
o.printStates();
System.out.println("-----------------»Ö¸´¼ì²éµã-----------------");
// »Ö¸´µ½µÚ¶þ¸ö¼ì²éµã
c.restoreMemento(2);
// ´òÓ¡³öËùÓмì²éµã
o.printStates();
}
}
¡¡ÔËÐнá¹ûÈçÏ£º
[html]
¼ì²éµã¹²ÓУº4¸ö
state 0
state 1
state 2
state 3
-----------------»Ö¸´¼ì²éµã-----------------
¼ì²éµã¹²ÓУº3¸ö
state 0
state 1
state 2
¼ì²éµã¹²ÓУº4¸ö
state 0
state 1
state 2
state 3
-----------------»Ö¸´¼ì²éµã-----------------
¼ì²éµã¹²ÓУº3¸ö
state 0
state 1
state 2
¡¡¡¡¿ÉÒÔ¿´³ö£¬¿Í»§¶Ë½Çɫͨ¹ý²»¶Ï¸Ä±ä·¢ÆðÈ˽ÇÉ«µÄ״̬£¬²¢½«Ö®´æ´¢ÔÚ±¸Íü¼ÀïÃæ¡£Í¨¹ýÖ¸Ã÷¼ì²éµãÖ¸Êý¿ÉÒÔ½«·¢ÆðÈ˽ÇÉ«»Ö¸´µ½ÏàÓ¦µÄ¼ì²éµãËù¶ÔÓ¦µÄ״̬ÉÏ¡£
¡¡¡¡½«·¢ÆðÈ˵Ä״̬´æ´¢µ½±¸Íü¼¶ÔÏóÖеĻÐòÁÐͼÈçÏ£º

¡¡¡¡ÏµÍ³ÔËÐеÄʱÐòÊÇÕâÑùµÄ£º
¡¡¡¡£¨1£©½«·¢ÆðÈ˶ÔÏóµÄ״̬ÉèÖóÉij¸öÓÐЧ״̬£»
¡¡¡¡£¨2£©µ÷ÓøºÔðÈ˽ÇÉ«µÄcreateMemento()·½·¨£¬¸ºÔðÈ˽ÇÉ«»á¸ºÔðµ÷Ó÷¢ÆðÈ˽ÇÉ«ºÍ±¸Íü¼½ÇÉ«£¬½«·¢ÆðÈ˶ÔÏóµÄ״̬´æ´¢ÆðÀ´¡£
¡¡¡¡½«·¢ÆðÈ˶ÔÏó»Ö¸´µ½Ä³Ò»¸ö±¸Íü¼¶ÔÏóµÄ¼ì²éµãµÄ»î¶¯ÐòÁÐͼÈçÏ£º

¡¡¡¡ÓÉÓÚ¸ºÔðÈ˽ÇÉ«µÄ¹¦Äܱ»ÔöÇ¿ÁË£¬Òò´Ë½«·¢ÆðÈ˶ÔÏó»Ö¸´µ½±¸Íü¼¶ÔÏóËù¼Ç¼µÄ״̬ʱ£¬ÏµÍ³ÔËÐеÄʱÐò±»¼ò»¯ÁË£º
¡¡¡¡£¨1£©µ÷ÓøºÔðÈ˽ÇÉ«µÄrestoreMemento()·½·¨£¬½«·¢ÆðÈ˻ָ´µ½Ä³¸ö¼ì²éµã¡£
¡¡¡°×ÔÊöÀúÊ·¡±Ä£Ê½
¡¡¡¡Ëùν¡°×ÔÊöÀúÊ·¡±Ä£Ê½(History-On-Self Pattern)ʵ¼ÊÉϾÍÊDZ¸Íü¼ģʽµÄÒ»¸ö±äÖÖ¡£ÔÚ±¸Íü¼ģʽÖУ¬·¢ÆðÈË(Originator)½ÇÉ«¡¢¸ºÔðÈË(Caretaker)½ÇÉ«ºÍ±¸Íü¼(Memento)½ÇÉ«¶¼ÊǶÀÁ¢µÄ½ÇÉ«¡£ËäÈ»ÔÚʵÏÖÉϱ¸Íü¼Àà¿ÉÒÔ³ÉΪ·¢ÆðÈËÀàµÄÄÚ²¿³ÉÔ±À࣬µ«ÊDZ¸Íü¼ÀàÈÔÈ»±£³Ö×÷Ϊһ¸ö½ÇÉ«µÄ¶ÀÁ¢ÒâÒå¡£ÔÚ¡°×ÔÊöÀúÊ·¡±Ä£Ê½ÀïÃæ£¬·¢ÆðÈ˽ÇÉ«×Ô¼º¼æÈθºÔðÈ˽ÇÉ«¡£
¡¡¡¡¡°×ÔÊöÀúÊ·¡±Ä£Ê½µÄÀàͼÈçÏÂËùʾ£º

¡¡¡¡±¸Íü¼½ÇÉ«ÓÐÈçÏÂÔðÈΣº
¡¡¡¡£¨1£©½«·¢ÆðÈË£¨Originator£©¶ÔÏóµÄÄÚ²¿×´Ì¬´æ´¢ÆðÀ´¡£
¡¡¡¡£¨2£©±¸Íü¼¿ÉÒÔ±£»¤ÆäÄÚÈݲ»±»·¢ÆðÈË£¨Originator£©¶ÔÏóÖ®ÍâµÄÈκζÔÏóËù¶ÁÈ¡¡£
¡¡¡¡·¢ÆðÈ˽ÇÉ«ÓÐÈçÏÂÔðÈΣº
¡¡¡¡£¨1£©´´½¨Ò»¸öº¬ÓÐËüµ±Ç°µÄÄÚ²¿×´Ì¬µÄ±¸Íü¼¶ÔÏó¡£
¡¡¡¡£¨2£©Ê¹Óñ¸Íü¼¶ÔÏó´æ´¢ÆäÄÚ²¿×´Ì¬¡£
¡¡¡¡¿Í»§¶Ë½ÇÉ«ÓиºÔ𱣴汸Íü¼¶ÔÏóµÄÔðÈΡ£
¡¡¡¡Ô´´úÂë
¡¡¡¡Õ½Ó¿ÚMementoIF£¬ÕâÊÇÒ»¸ö±êʶ½Ó¿Ú£¬Òò´ËËüûÓж¨Òå³öÈκεķ½·¨¡£
[java]
package com.bankht.Memento.HistoryOnSelf;
/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-2 ÏÂÎç05:02:31
*
* @Àà˵Ã÷ £ºÕ½Ó¿ÚMementoIF£¬ÕâÊÇÒ»¸ö±êʶ½Ó¿Ú£¬Òò´ËËüûÓж¨Òå³öÈκεķ½·¨¡£
*/
public interface MementoIF {
}
package com.bankht.Memento.HistoryOnSelf;
/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-2 ÏÂÎç05:02:31
*
* @Àà˵Ã÷ £ºÕ½Ó¿ÚMementoIF£¬ÕâÊÇÒ»¸ö±êʶ½Ó¿Ú£¬Òò´ËËüûÓж¨Òå³öÈκεķ½·¨¡£
*/
public interface MementoIF {
}
¡¡·¢ÆðÈ˽Çɫͬʱ»¹¼æÈθºÔðÈ˽ÇÉ«£¬Ò²¾ÍÊÇ˵Ëü×Ô¼º¸ºÔð±£³Ö×Ô¼ºµÄ±¸Íü¼¶ÔÏó¡£
[java]
package com.bankht.Memento.HistoryOnSelf;
/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-2 ÏÂÎç05:02:57
*
* @Àà˵Ã÷ £º·¢ÆðÈ˽Çɫͬʱ»¹¼æÈθºÔðÈ˽ÇÉ«£¬Ò²¾ÍÊÇ˵Ëü×Ô¼º¸ºÔð±£³Ö×Ô¼ºµÄ±¸Íü¼¶ÔÏó¡£
*/
public class Originator {
public String state;
/**
* ¸Ä±ä״̬
*/
public void changeState(String state) {
this.state = state;
System.out.println("״̬¸Ä±äΪ£º" + state);
}
/**
* ¹¤³§·½·¨£¬·µ»¹Ò»¸öеı¸Íü¼¶ÔÏó
*/
public Memento createMemento() {
return new Memento(this);
}
/**
* ½«·¢ÆðÈ˻ָ´µ½±¸Íü¼¶ÔÏóËù¼Ç¼µÄ״̬ÉÏ
*/
public void restoreMemento(MementoIF memento) {
Memento m = (Memento) memento;
changeState(m.state);
}
private class Memento implements MementoIF {
private String state;
/**
* ¹¹Ôì·½·¨
*/
private Memento(Originator o) {
this.state = o.state;
}
private String getState() {
return state;
}
}
}
package com.bankht.Memento.HistoryOnSelf;
/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-2 ÏÂÎç05:02:57
*
* @Àà˵Ã÷ £º·¢ÆðÈ˽Çɫͬʱ»¹¼æÈθºÔðÈ˽ÇÉ«£¬Ò²¾ÍÊÇ˵Ëü×Ô¼º¸ºÔð±£³Ö×Ô¼ºµÄ±¸Íü¼¶ÔÏó¡£
*/
public class Originator {
public String state;
/**
* ¸Ä±ä״̬
*/
public void changeState(String state) {
this.state = state;
System.out.println("״̬¸Ä±äΪ£º" + state);
}
/**
* ¹¤³§·½·¨£¬·µ»¹Ò»¸öеı¸Íü¼¶ÔÏó
*/
public Memento createMemento() {
return new Memento(this);
}
/**
* ½«·¢ÆðÈ˻ָ´µ½±¸Íü¼¶ÔÏóËù¼Ç¼