备忘录模式
介绍
设计模式 | 定义 | 案例 | 问题堆积在哪里 | 解决办法 |
备忘录模式 | 行为型模式, 保存了数据某一个时间点的状态 在需要的时候进行回档 | 单机游戏的角色 数据保存并且回档 | 保存和回档 | 加一个状态管理类 |
类图
代码
MomentData
using UnityEngine;
public class MomentData
{
public string roleName;
public int HP;
public int MP;
public Vector3 rolePos = Vector3.zero;
MomentData() { }
public MomentData(MomentData m)
{
this.roleName = m.roleName;
this.HP = m.HP;
this.MP = m.MP;
this.rolePos = m.rolePos;
}
public MomentData(string roleName, int HP, int MP, Vector3 rolePos)
{
SetData(roleName, HP, MP, rolePos);
}
public void SetData(string roleName, int HP, int MP, Vector3 rolePos)
{
this.roleName = roleName;
this.HP = HP;
this.MP = MP;
this.rolePos = rolePos;
}
// 被攻击
public void BeAttack()
{
HP--;
}
}
Momento
using System.Collections.Generic;
public class Momento
{
// 保存数据集合
Dictionary<string, MomentData> dic = new Dictionary<string, MomentData>();
// 保存
public void Save(string key, MomentData data)
{
MomentData newdata = new MomentData(data);
dic.Add(key, newdata);
}
// 加载
public MomentData Load(string key, MomentData data)
{
if (dic.ContainsKey(key))
{
MomentData old = dic[key];
data.roleName = old.roleName;
data.HP = old.HP;
data.MP = old.MP;
data.rolePos = old.rolePos;
}
return null;
}
}
测试代码
using UnityEngine;
public class TestBWL : MonoBehaviour
{
void Start()
{
Momento m = new Momento();
MomentData data = new MomentData("王者", 100, 80, Vector3.zero);
// 打boss前保存
m.Save("打boss前", data);
// 被攻击
for (int i = 0; i < 99; i++)
{
data.BeAttack();
}
Debug.Log(data.roleName + " 当前血量: " + data.HP);
// 使用回档技能
m.Load("打boss前", data);
Debug.Log(data.roleName + " 回档后血量: " + data.HP);
}
}
结果
总结
这个模式比较简单 ,做个容器保存“状态数据”,然后再包一层方便使用。