美文网首页Unity Come On
Unity【话大】设计模式之备忘录模式

Unity【话大】设计模式之备忘录模式

作者: su9257_海澜 | 来源:发表于2019-02-04 01:52 被阅读31次

    前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了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()函数耗时过长且含有较多的值类型,可以配合原型模式使用。

    相关文章

      网友评论

        本文标题:Unity【话大】设计模式之备忘录模式

        本文链接:https://www.haomeiwen.com/subject/cyousqtx.html