设计模式漫谈之备忘录模式

最近很长时间没写博客了,其实这个博客写过一半,中间有事耽搁了,就没继续。主要是给别人做了一个小系统,及维护码云上的代码库。同居的日子也占了我很多时间。

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

总结,思想的东西是不分语言的,只要有思维的人类,其思想是互通的。编程语言的核心就是思想。编程语言为了让人类使用,必须适应人类的思维。

今天到此为止,以后多多学习,我女朋友说我除了写代码,其他方面就是弱智,哎,人总要有一个爱好的。否则生活好无趣!

原文地址:https://www.cnblogs.com/wang-charle/p/9357221.html