設計模式漫談之備忘錄模式

Wang_Charle發表於2018-07-23

最近很長時間沒寫部落格了,其實這個部落格寫過一半,中間有事耽擱了,就沒繼續。主要是給別人做了一個小系統,及維護碼雲上的程式碼庫。同居的日子也佔了我很多時間。

最近也是煩,欠了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();

 

總結,思想的東西是不分語言的,只要有思維的人類,其思想是互通的。程式語言的核心就是思想。程式語言為了讓人類使用,必須適應人類的思維。

 

今天到此為止,以後多多學習,我女朋友說我除了寫程式碼,其他方面就是弱智,哎,人總要有一個愛好的。否則生活好無趣!

 

相關文章