一、什么是备忘录模式
在不破坏对象内部状态的情况,捕获状态,并在外部保存该状态
保存一个对象的某一状态,以便在适当的时候恢复对象,这样对象就能恢复到之前的状态了。提供了可以恢复状态的机制,发起人可以让其恢复到某个历史状态。
UML图
Originator:发起人类,到时候需要存储它的不同状态,里面有一个存储状态方法和一个 恢复状态方法
Memento:备忘录,里面就是一堆数据,发起人类需要存储的数据
Caretaker:管理者,管理备忘录
二、适用场景
需要保存恢复的场景,可以回滚的操作.比如游戏的存档,你在打Boss之前可以先存一下档,然后这局boss打的不理想,就能恢复到存档的状态。比如浏览网页时跳到下一页,也可以回退到上一页。比如手机APP的一些操作,都可以回退。VS编写代码就可以很好的回退,使用Ctrl+Z ,Ctrl+Y操作。
三、优缺点
优点
可以保存想要的状态,在适当的时机恢复到该状态
封装了信息细节
缺点
资源消耗大,占用存储空间
四、大话中的例子
李逍遥战斗的例子, 在战斗之初 状态都是满的,存下档, 进去和boss战斗,状态都为0了,恢复一下状态, 状态又满了。李逍遥的类,属性:攻击 ,属性:生命值,存储状态的方法, 恢复状态的方法。一个备忘录,属性就是李逍遥的那些需要保存的属性。 一个管理器类,持有备忘录。李逍遥和管理器耦合。
五、我的例子
using System;
namespace MementoMode
{
class Program
{
static void Main(string[] args)
{
Caretaker caretaker = new Caretaker();
Naruto naruto = new Naruto();
naruto.Show();//初始的状态
naruto.FightingWithSoldier();//打过第一关
naruto.FightingWithSoldier();//打过第二关
naruto.Show();
caretaker.Memen = naruto.CreateMemento();//存下来
naruto.FightingWithSoldier();//打过第三关
naruto.Show();
naruto.FightingWithBoss();//打boss
naruto.Show();
naruto.SetMemento(caretaker.Memen);//恢复存档
naruto.Show();
Console.ReadKey();
}
}
class Naruto
{
int lv;
int hp;
int atk;
public int Level { get => lv; set => lv = value; }
public int HP { get => hp; set => hp = value; }
public int Attack { get => atk; set => atk = value; }
public Naruto()
{
lv = 1;
hp = 100;
atk = 20;
}
public Memento CreateMemento()
{
return new Memento(lv, hp, atk);
}
public void SetMemento(Memento memento)
{
lv = memento.Level;
hp = memento.HP;
atk = memento.Attack;
}
public void FightingWithSoldier()
{
lv += 1;
hp += 10;
atk += 2;
}
public void FightingWithBoss()
{
lv = 1;
hp = 0;
atk = 0;
}
public void Show()
{
Console.WriteLine("等级:{0},血量:{1},攻击力:{2}", lv, hp, atk);
}
}
class Memento
{
int lv;
int hp;
int atk;
public int Level { get => lv; set => lv = value; }
public int HP { get => hp; set => hp = value; }
public int Attack { get => atk; set => atk = value; }
public Memento(int lv, int hp, int atk)
{
this.lv = lv;
this.hp = hp;
this.atk = atk;
}
}
class Caretaker
{
Memento memen;
public Memento Memen { get => memen; set => memen = value; }
}
}
运行结果
PS:备忘录模式是比较常用的模式,在项目中时常需要保存状态,并恢复到想要的状态,但该模式下如果保存数据过多哦,会消耗过多性能,内存使用过多。和原型模式有些像, 不过原型模式是创建型, 备忘录模式是行为型,原型模式是拷贝一份和原对象一模一样的备份对象存储起来, 备忘录只是摘选需要的属性和数据存储。
来源:CSDN
作者:彩色墨水
链接:https://blog.csdn.net/weixin_44186849/article/details/103597212