备忘录模式

意图
在不破坏封装性的前提条件下,捕获一个对象的内部状态,然后在该对象之外保存这个状态。以后在需要的时候可以将该对象恢复到原先保存的状态。

结构
备忘录模式

1.Memento(备忘录):保存Originator(原发器)对象的内部状态,Originator根据需要决定保存哪些内部状态,防止自身以外的其它对象访问备忘录。备忘录实际上是由两个接口,其中Caretaker(管理者)只能看到备忘录的窄接口,即它只能将备忘录传递给其他对象;而原发器可以看到一个宽接口,允许他访问回到原先状态所需的所有数据,理想的情况是只允许生成原发器访问本备忘录的内部状态。
2.Originator:创建一个备忘录以记录当前时刻内部状态,使用备忘录恢复内部状态。
3.Caretaker:负责保存备忘录,但不能处理其中的内容。

使用场合
需要保存对象在某一时刻的状态,并在以后需要的时候恢复到这个状态。同时又不希望暴露对象的视线细节,破坏对象的封装性,这时需要使用备忘录模式。

效果
备忘录模式在不破坏封装性的前提下,实现对对象内部状态的外部保存。但如果保存的状态过多,或者设计不合理,则将产生过多的备忘录对象而占用大量的系统资源。

using System;

namespace MyApp

{

class Program

{

static void Main()

{

GameRole gameRole = new GameRole("Killer007");

gameRole.ShowState();

gameRole.HitBoss();

gameRole.HitBoss();

gameRole.Hitted();

gameRole.ShowState();

gameRole.SetMemento();

gameRole.Hitted();

gameRole.Hitted();

gameRole.Hitted();

gameRole.Hitted();

gameRole.ShowState();

gameRole.GetMemento();

gameRole.ShowState();

Console.ReadKey();

}

}

class GameRole

{

private string account;

private int blood;

private int magic;

private Memento memento;

public GameRole(string account)

{

this.account = account;

blood = 100;

magic = 100;

}

public void SetMemento()

{

this.memento = new Memento(blood, magic);

}

public void GetMemento()

{

this.blood = memento.Blood;

this.magic = memento.Magic;

}

public void HitBoss()

{

magic -= 20;

}

public void Hitted()

{

blood -= 20;

}

public void ShowState()

{

Console.WriteLine("Account:{0}", account);

Console.WriteLine(" Blood:{0}", blood.ToString());

Console.WriteLine(" Magic:{0}", magic.ToString());

Console.WriteLine();

}

}

class Memento

{

private int blood;

private int magic;

public int Blood

{

get

{

return blood;

}

}

public int Magic

{

get

{

return magic;

}

}

public Memento(int blood, int magic)

{

this.blood = blood;

this.magic = magic;

}

}

}

你可能感兴趣的:(备忘录模式)