Unity【话大】设计模式之备忘录模式
2019-02-04 本文已影响31人
su9257_海澜
前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了。
在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略。
有说的不正确或者不准确的地方欢迎留言指正
有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力
备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
比较简单,话不多少,直接上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Custom.Log;
public class Originator
{
private string state;
public string State
{
get { return state; }
set { state = value; }
}
public Memento CreateMemento()
{
return (new Memento(state));
}
public void SetMemento(Memento memento)
{
state = memento.State;
}
public void Show()
{
this.Log("State=" + state);
}
}
public class Memento
{
private string state;
public Memento(string state)
{
this.state = state;
}
public string State
{
get { return state; }
}
}
public class Caretaker
{
public Dictionary<string, Memento> keyValuePairs = new Dictionary<string, Memento>();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Custom.Log;
public class MementoConponent : MonoBehaviour
{
void Start()
{
Originator originator = new Originator();
originator.State = "On";
originator.Show();
Caretaker caretaker = new Caretaker();
caretaker.keyValuePairs.Add("版本1", originator.CreateMemento());
originator.State = "Off";
originator.Show();
originator.SetMemento(caretaker.keyValuePairs["版本1"]);
originator.Show();
}
}
- Caretaker: 对所有版本的持有者
- Memento:每一个版本对应的数据结构
- Originator: 对应版本数据的应用者
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
如果 CreateMemento()函数耗时过长且含有较多的值类型,可以配合原型模式使用。