ģʽ¶¯»ú

ΪÁËʹÈí¼þµÄʹÓøü¼ÓÈËÐÔ»¯£¬¶ÔÓÚÎó²Ù×÷£¬ÎÒÃÇÐèÒªÌṩһÖÖÀàËÆ¡°ºó»ÚÒ©¡±µÄ»úÖÆ£¬ÈÃÈí¼þϵͳ¿ÉÒԻص½Îó²Ù×÷ǰµÄ״̬£¬Òò´ËÐèÒª±£´æÓû§Ã¿Ò»´Î²Ù×÷ʱϵͳµÄ״̬£¬Ò»µ©³öÏÖÎó²Ù×÷£¬¿ÉÒÔ°Ñ´æ´¢µÄÀúʷ״̬ȡ³ö¼´¿É»Øµ½Ö®Ç°µÄ״̬¡£
ÏÖÔÚ´ó¶àÊýÈí¼þ¶¼Óг·Ïú(Undo)µÄ¹¦ÄÜ£¬¿ì½Ý¼üÒ»°ã¶¼ÊÇCtrl+Z£¬Ä¿µÄ¾ÍÊÇΪÁ˽â¾öÕâ¸öºó»ÚµÄÎÊÌâ¡£

ÔÚÓ¦ÓÃÈí¼þµÄ¿ª·¢¹ý³ÌÖУ¬ºÜ¶àʱºòÎÒÃǶ¼ÐèÒª¼Ç¼һ¸ö¶ÔÏóµÄÄÚ²¿×´Ì¬¡£
ÔÚ¾ßÌåʵÏÖ¹ý³ÌÖУ¬ÎªÁËÔÊÐíÓû§È¡Ïû²»È·¶¨µÄ²Ù×÷»ò´Ó´íÎóÖлָ´¹ýÀ´£¬ÐèҪʵÏÖ±¸·ÝµãºÍ³·Ïú»úÖÆ£¬¶øÒªÊµÏÖÕâЩ»úÖÆ£¬±ØÐëÊÂÏȽ«×´Ì¬ÐÅÏ¢±£´æÔÚij´¦£¬ÕâÑù²ÅÄܽ«¶ÔÏó»Ö¸´µ½ËüÃÇÔÏȵÄ״̬¡£
±¸Íü¼ģʽÊÇÒ»ÖÖ¸øÎÒÃǵÄÈí¼þÌṩºó»ÚÒ©µÄ»úÖÆ£¬Í¨¹ýËü¿ÉÒÔʹϵͳ»Ö¸´µ½Ä³Ò»Ìض¨µÄÀúʷ״̬¡£
ģʽ¶¨Òå
±¸Íü¼ģʽ(Memento Pattern)£ºÔÚ²»ÆÆ»µ·â×°µÄǰÌáÏ£¬²¶»ñÒ»¸ö¶ÔÏóµÄÄÚ²¿×´Ì¬£¬²¢ÔڸöÔÏóÖ®Íâ±£´æÕâ¸ö״̬£¬ÕâÑù¿ÉÒÔÔÚÒԺ󽫶ÔÏó»Ö¸´µ½ÔÏȱ£´æµÄ״̬¡£ËüÊÇÒ»ÖÖ¶ÔÏóÐÐΪÐÍģʽ£¬Æä±ðÃûΪ
Token ¡£
UMLͼ

ģʽ½á¹¹
±¸Íü¼ģʽ°üº¬ÈçϽÇÉ«£º
1.Originator: Ô·¢Æ÷
2.Memento: ±¸Íü¼
3.Caretaker: ¸ºÔðÈË
ģʽ·ÖÎö
ÓÉÓÚÔÚ±¸Íü¼Öд洢µÄÊÇÔ·¢Æ÷µÄÖмä״̬£¬Òò´ËÐèÒª·ÀÖ¹Ô·¢Æ÷ÒÔÍâµÄÆäËû¶ÔÏó·ÃÎʱ¸Íü¼¡£
±¸Íü¼¶ÔÏóͨ³£·â×°ÁËÔ·¢Æ÷µÄ²¿·Ö»òËùÓеÄ״̬ÐÅÏ¢£¬¶øÇÒÕâЩ״̬²»Äܱ»ÆäËû¶ÔÏó·ÃÎÊ£¬Ò²¾ÍÊÇ˵²»ÄÜÔÚ±¸Íü¼¶ÔÏóÖ®Íâ±£´æÔ·¢Æ÷״̬£¬ÒòΪ±©Â¶ÆäÄÚ²¿×´Ì¬½«Î¥·´·â×°µÄÔÔò£¬¿ÉÄÜÓÐËðϵͳµÄ¿É¿¿ÐԺͿÉÀ©Õ¹ÐÔ¡£
ΪÁËʵÏÖ¶Ô±¸Íü¼¶ÔÏóµÄ·â×°£¬ÐèÒª¶Ô±¸Íü¼µÄµ÷ÓýøÐпØÖÆ:
1.¶ÔÓÚÔ·¢Æ÷¶øÑÔ£¬Ëü¿ÉÒÔµ÷Óñ¸Íü¼µÄËùÓÐÐÅÏ¢£¬ÔÊÐíÔ·¢Æ÷·ÃÎÊ·µ»Øµ½ÏÈǰ״̬ËùÐèµÄËùÓÐÊý¾Ý£»
2. ¶ÔÓÚ¸ºÔðÈ˶øÑÔ£¬Ö»¸ºÔð±¸Íü¼µÄ±£´æ²¢½«±¸Íü¼´«µÝ¸øÆäËû¶ÔÏó£»
3. ¶ÔÓÚÆäËû¶ÔÏó¶øÑÔ£¬Ö»ÐèÒª´Ó¸ºÔðÈË´¦È¡³ö±¸Íü¼¶ÔÏó²¢½«Ô·¢Æ÷¶ÔÏóµÄ״̬»Ö¸´£¬¶øÎÞÐë¹ØÐı¸Íü¼µÄ±£´æÏ¸½Ú¡£
ÀíÏëµÄÇé¿öÊÇÖ»ÔÊÐíÉú³É¸Ã±¸Íü¼µÄÄǸöÔ·¢Æ÷·ÃÎʱ¸Íü¼µÄÄÚ²¿×´Ì¬¡£
ģʽʵÀýÓë½âÎö
ÓÎÏ·´æ½ø¶È¡ª±¸Íü¼ģʽʾÀý´úÂë
Ìåϵ½á¹¹

Originator: Ô·¢Æ÷ GameRole . cs
using
System;
namespace MementoPattern
{
class GameRole
{
//ÉúÃüÁ¦
private int vit;
public int Vitality
{
get { return vit; }
set { vit = value; }
}
//¹¥»÷Á¦
private int atk;
public int Attack
{
get { return atk; }
set { atk = value; }
}
//·ÀÓùÁ¦
private int def;
public int Defense
{
get { return def; }
set { def = value; }
}
//״̬ÏÔʾ
public void StateDisplay()
{
Console.WriteLine("½ÇÉ«µ±Ç°×´Ì¬£º");
Console.WriteLine("ÌåÁ¦£º{0}", this.vit);
Console.WriteLine("¹¥»÷Á¦£º{0}", this.atk);
Console.WriteLine("·ÀÓùÁ¦£º{0}", this.def);
Console.WriteLine("");
}
//»ñµÃ³õʼ״̬
public void GetInitState()
{
this.vit = 100;
this.atk = 100;
this.def = 100;
}
//Õ½¶·
public void Fight()
{
this.vit = 0;
this.atk = 0;
this.def = 0;
}
//±£´æ½Çɫ״̬
public RoleStateMemento SaveState()
{
return (new RoleStateMemento
(vit, atk, def));
}
//»Ö¸´½Çɫ״̬
public void RecoveryState
(RoleStateMemento memento)
{
this.vit = memento.Vitality;
this.atk = memento.Attack;
this.def = memento.Defense;
}
}
} |
Memento: ±¸Íü¼ RoleStateMemento.cs
namespace
MementoPattern
{
//½Çɫ״̬´æ´¢Ïä
class RoleStateMemento
{
private int vit;
private int atk;
private int def;
public RoleStateMemento(int
vit, int atk, int
def)
{
this.vit = vit;
this.atk = atk;
this.def = def;
}
//ÉúÃüÁ¦
public int Vitality
{
get { return vit; }
set { vit = value; }
}
//¹¥»÷Á¦
public int Attack
{
get { return atk; }
set { atk = value; }
}
//·ÀÓùÁ¦
public int Defense
{
get { return def; }
set { def = value; }
}
}
} |
Caretaker: ¸ºÔðÈË RoleStateCaretaker
.cs
namespace
MementoPattern
{
//½Çɫ״̬¹ÜÀíÕß
class RoleStateCaretaker
{
private RoleStateMemento memento;
public RoleStateMemento Memento
{
get { return memento; }
set { memento = value; }
}
}
} |
Client£º¿Í»§Àà
using
System;
namespace MementoPattern
{
class Program
{
static void Main(string[] args)
{
//´óÕ½Bossǰ
GameRole lixiaoyao = new GameRole();
lixiaoyao.GetInitState();
lixiaoyao.StateDisplay();
//±£´æ½ø¶È
RoleStateCaretaker stateAdmin
= new RoleStateCaretaker();
stateAdmin.Memento = lixiaoyao
.SaveState();
//´óÕ½Bossʱ£¬ËðºÄÑÏÖØ
lixiaoyao.Fight();
lixiaoyao.StateDisplay();
//»Ö¸´Ö®Ç°µÄ״̬
lixiaoyao.RecoveryState
(stateAdmin.Memento);
lixiaoyao.StateDisplay();
Console.Read();
}
}
} |
ģʽÓÅȱµã
±¸Íü¼ģʽµÄÓŵã
1.ÌṩÁËÒ»ÖÖ״̬»Ö¸´µÄʵÏÖ»úÖÆ£¬Ê¹µÃÓû§¿ÉÒÔ·½±ãµØ»Øµ½Ò»¸öÌØ¶¨µÄÀúÊ·²½Ö裬µ±ÐµÄ״̬ÎÞЧ»òÕß´æÔÚÎÊÌâʱ£¬¿ÉÒÔʹÓÃÏÈǰ´æ´¢ÆðÀ´µÄ±¸Íü¼½«×´Ì¬¸´Ô¡£ÊµÏÖÁËÐÅÏ¢µÄ·â×°£¬Ò»¸ö±¸Íü¼¶ÔÏóÊÇÒ»ÖÖÔ·¢Æ÷¶ÔÏóµÄ±íʾ£¬²»»á±»ÆäËû´úÂë¸Ä¶¯£¬ÕâÖÖģʽ¼ò»¯ÁËÔ·¢Æ÷¶ÔÏ󣬱¸Íü¼ֻ±£´æÔ·¢Æ÷µÄ״̬£¬²ÉÓöÑÕ»À´´æ´¢±¸Íü¼¶ÔÏó¿ÉÒÔʵÏÖ¶à´Î³·Ïú²Ù×÷£¬¿ÉÒÔͨ¹ýÔÚ¸ºÔðÈËÖж¨Ò弯ºÏ¶ÔÏóÀ´´æ´¢¶à¸ö±¸Íü¼¡£
2.±¸Íü¼ģʽµÄȱµã
3. ×ÊÔ´ÏûºÄ¹ý´ó£¬Èç¹ûÀàµÄ³ÉÔ±±äÁ¿Ì«¶à£¬¾Í²»¿É±ÜÃâÕ¼ÓôóÁ¿µÄÄڴ棬¶øÇÒÿ±£´æÒ»´Î¶ÔÏóµÄ״̬¶¼ÐèÒªÏûºÄÄÚ´æ×ÊÔ´£¬Èç¹ûÖªµÀÕâÒ»µã´ó¼Ò¾ÍÈÝÒ×Àí½âΪʲôһЩÌṩÁ˳·Ïú¹¦ÄܵÄÈí¼þÔÚÔËÐÐʱËùÐèµÄÄÚ´æºÍÓ²Å̿ռä±È½Ï´óÁË¡£
ģʽÊÊÓû·¾³
ÔÚÒÔÏÂÇé¿öÏ¿ÉÒÔʹÓñ¸Íü¼ģʽ£º
1.±£´æÒ»¸ö¶ÔÏóÔÚijһ¸öʱ¿ÌµÄ״̬»ò²¿·Ö״̬£¬ÕâÑùÒÔºóÐèҪʱËüÄܹ»»Ö¸´µ½ÏÈǰµÄ״̬¡£
2. Èç¹ûÓÃÒ»¸ö½Ó¿ÚÀ´ÈÃÆäËû¶ÔÏóµÃµ½ÕâЩ״̬£¬½«»á±©Â¶¶ÔÏóµÄʵÏÖϸ½Ú²¢ÆÆ»µ¶ÔÏóµÄ·â×°ÐÔ£¬Ò»¸ö¶ÔÏó²»Ï£ÍûÍâ½çÖ±½Ó·ÃÎÊÆäÄÚ²¿×´Ì¬£¬Í¨¹ý¸ºÔðÈË¿ÉÒÔ¼ä½Ó·ÃÎÊÆäÄÚ²¿×´Ì¬¡£
ģʽӦÓÃ
(1) ¼¸ºõËùÓеÄÎÄ×Ö»òÕßͼÏñ±à¼Èí¼þ¶¼ÌṩÁ˳·Ïú(Ctrl+Z)µÄ¹¦ÄÜ£¬¼´³·Ïú²Ù×÷£¬µ«Êǵ±Èí¼þ¹Ø±ÕÔÙ´ò¿ªÊ±²»ÄÜÔÙ½øÐг·Ïú²Ù×÷£¬Ò²¾ÍÊÇ˵²»ÄÜÔٻص½¹Ø±ÕÈí¼þǰµÄ״̬£¬Êµ¼ÊÉÏÕâÖмä¾ÍʹÓõ½Á˱¸Íü¼ģʽ£¬ÔÚ±à¼ÎļþµÄͬʱ¿ÉÒÔ±£´æÒ»Ð©ÄÚ²¿×´Ì¬£¬ÕâЩ״̬ÔÚÈí¼þ¹Ø±Õʱ´ÓÄÚ´æÏú»Ù£¬µ±È»ÕâЩ״̬µÄ±£´æÒ²²»ÊÇÎÞÏ޵ģ¬ºÜ¶àÈí¼þÖ»ÌṩÓÐÏ޴εij·Ïú²Ù×÷¡£
(2) Êý¾Ý¿â¹ÜÀíϵͳDBMSËùÌṩµÄÊÂÎñ¹ÜÀíÓ¦ÓÃÁ˱¸Íü¼ģʽ£¬µ±Êý¾Ý¿âijÊÂÎñÖÐÒ»ÌõÊý¾Ý²Ù×÷Óï¾äÖ´ÐÐʧ°Üʱ£¬Õû¸öÊÂÎñ½«½øÐлعö²Ù×÷£¬ÏµÍ³»Øµ½ÊÂÎñÖ´ÐÐ֮ǰµÄ״̬¡£
ģʽÀ©Õ¹
±¸Íü¼µÄ·â×°ÐÔ
1.ΪÁËÈ·±£±¸Íü¼µÄ·â×°ÐÔ£¬³ýÁËÔ·¢Æ÷Í⣬ÆäËûÀàÊDz»ÄÜÒ²²»Ó¦¸Ã·ÃÎʱ¸Íü¼ÀàµÄ£¬ÔÚʵ¼Ê¿ª·¢ÖУ¬Ô·¢Æ÷Ó뱸Íü¼֮¼äµÄ¹ØÏµÊǷdz£ÌØÊâµÄ£¬ËüÃÇÒª·ÖÏíÐÅÏ¢¶ø²»ÈÃÆäËûÀàÖªµÀ£¬ÊµÏֵķ½·¨Òò±à³ÌÓïÑԵIJ»Í¬¶ø²»Í¬¡£
2. C++¿ÉÒÔÓÃfriend¹Ø¼ü×Ö£¬Ê¹Ô·¢Æ÷ÀàºÍ±¸Íü¼Àà³ÉΪÓÑÔªÀ࣬»¥ÏàÖ®¼ä¿ÉÒÔ·ÃÎʶÔÏóµÄһЩ˽ÓеÄÊôÐÔ£»
3. ÔÚJavaÓïÑÔÖпÉÒÔ½«Á½¸öÀà·ÅÔÚÒ»¸ö°üÖУ¬Ê¹ËüÃÇÖ®¼äÂú×ãĬÈϵİüÄڿɼûÐÔ£¬Ò²¿ÉÒÔ½«±¸Íü¼Àà×÷ΪԷ¢Æ÷ÀàµÄÄÚ²¿À࣬ʹµÃÖ»ÓÐÔ·¢Æ÷²Å¿ÉÒÔ·ÃÎʱ¸Íü¼ÖеÄÊý¾Ý£¬ÆäËû¶ÔÏó¶¼ÎÞ·¨Ê¹Óñ¸Íü¼ÖеÄÊý¾Ý¡£
¶à±¸·ÝʵÏÖ
4. ÔÚ¸ºÔðÈËÖж¨ÒåÒ»¸ö¼¯ºÏ¶ÔÏóÀ´´æ´¢¶à¸ö״̬£¬¶øÇÒ¿ÉÒÔ·½±ãµØ·µ»Øµ½Ä³Ò»Àúʷ״̬¡£
5.ÔÚ±¸·Ý¶ÔÏóʱ¿ÉÒÔ×öһЩ¼ÇºÅ£¬ÕâЩ¼ÇºÅ³ÆÎª¼ì²éµã(Check Point)¡£ÔÚʹÓÃHashMapµÈʵÏÖʱ¿ÉÒÔʹÓÃKeyÀ´ÉèÖüì²éµã¡£ |