設計模式漫談之備忘錄模式
最近很長時間沒寫博客了,其實這個博客寫過一半,中間有事耽擱了,就沒繼續。主要是給別人做了一個小系統,及維護碼雲上的代碼庫。同居的日子也占了我很多時間。
最近也是煩,欠了7W,各種煩事。所以可想寫個博客靜靜心。
在面向對象中關註的焦點是對象空間,對象與對象的聯系還是通過保存引用(相當於路),來走到其空間中。
在對象中是有空間的,空間裏放的肯定是數據或者是命令。
備忘錄就是把A對象的空間數據,備份到B對象空間一份。如果A對象與B對象是一個類型的對象,未免浪費B對象的空間,因為我是個性保存數據的,不一定是保存A的所有數據。
所以最好把B對象設計成一個專一保存A要保存數據的宿主對象,由於在內存中B對象是要隨時用的,那也需要把B對象存起來,存在哪裏?創造一個宿主對象C即可。
說的太多,直接看例子,我解釋。
//空間對象
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 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;
}
public void GetInitState()
{
this.vit = 100;
this.atk = 100;
this.def = 100;
}
public void Fight()
{
this.vit = 0;
this.atk = 0;
this.def = 0;
}
}
//數據宿主對象
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; }
}
}
//數據宿主的宿主對象
class RoleStateCaretaker
{
//存的是數據宿主
private RoleStateMemento memento;
public RoleStateMemento Memento
{
get { return memento; }
set { memento = value; }
}
}
//創建對象
GameRole lixiaoyao = new GameRole();
lixiaoyao.GetInitState();
lixiaoyao.StateDisplay();
//把對象的數據存在數據對象宿主中,然後再把數據對象宿主放在另一個對象中(即數據對象的宿主的宿主對象)
RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
stateAdmin.Memento = lixiaoyao.SaveState();
lixiaoyao.Fight();
lixiaoyao.StateDisplay();
//從數據宿主對象中恢復數據。
lixiaoyao.RecoveryState(stateAdmin.Memento);
lixiaoyao.StateDisplay();
總結,思想的東西是不分語言的,只要有思維的人類,其思想是互通的。編程語言的核心就是思想。編程語言為了讓人類使用,必須適應人類的思維。
今天到此為止,以後多多學習,我女朋友說我除了寫代碼,其他方面就是弱智,哎,人總要有一個愛好的。否則生活好無趣!
設計模式漫談之備忘錄模式