设计模式---备忘录模式(DesignPattern_Memento)

摘录自:设计模式与游戏完美开发

十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。


工程GitHub

using UnityEngine;
using System.Collections.Generic;

namespace DesignPattern_Memento
{
    // 存放Originator物件的內部狀態
    public class Memento
    {
        string m_State; 
        public string GetState()
        {
            return m_State;
        }

        public void SetState(string State)
        {
            m_State = State;
        }
    }

    // 需要儲存內容資訊
    public class Originator
    {
        string m_State; // 狀態,需要被保存

        public void SetInfo(string State)
        {
            m_State = State;
        }

        public void ShowInfo()
        {
            Debug.Log("Originator State:"+m_State);
        }

        // 產生要儲存的記錄
        public Memento CreateMemento()
        {
            Memento newMemento = new Memento();
            newMemento.SetState( m_State );
            return newMemento;
        }

        // 設定要回復的記錄
        public void SetMemento( Memento m)
        {
            m_State = m.GetState();
        }
    }

    // 保管所有的Memento
    public class Caretaker
    {
        Dictionary<string, Memento> m_Memntos = new Dictionary<string, Memento>();

        // 增加
        public void AddMemento(string Version , Memento theMemento)
        {
            if(m_Memntos.ContainsKey(Version)==false)
                m_Memntos.Add(Version, theMemento);
            else
                m_Memntos[Version]=theMemento;
        }

        // 取回
        public Memento GetMemento(string Version)
        {
            if(m_Memntos.ContainsKey(Version)==false)
                return null;
            return m_Memntos[Version];
        }

    }


}
using UnityEngine;
using System.Collections;
using DesignPattern_Memento;

public class MementoTest : MonoBehaviour {

    // Use this for initialization
    void Start () {
        UnitTest(); 
        UnitTest2();
    }
    
    // 
    void UnitTest () {
            
        Originator theOriginator = new Originator();

        // 設定資訊
        theOriginator.SetInfo( "Step1" );
        theOriginator.ShowInfo();

        // 儲存狀態
        Memento theMemnto = theOriginator.CreateMemento();

        // 設定新的資訊
        theOriginator.SetInfo( "Step2" );
        theOriginator.ShowInfo();

        // 復原
        theOriginator.SetMemento( theMemnto );
        theOriginator.ShowInfo();
    
    }

    // 
    void UnitTest2 () {
        
        Originator theOriginator = new Originator();
        Caretaker theCaretaker = new Caretaker();
        
        // 設定資訊
        theOriginator.SetInfo( "Version1" );
        theOriginator.ShowInfo();
        // 保存
        theCaretaker.AddMemento("1",theOriginator.CreateMemento());

        // 設定資訊
        theOriginator.SetInfo( "Version2" );
        theOriginator.ShowInfo();
        // 保存
        theCaretaker.AddMemento("2",theOriginator.CreateMemento());

        // 設定資訊
        theOriginator.SetInfo( "Version3" );
        theOriginator.ShowInfo();
        // 保存
        theCaretaker.AddMemento("3",theOriginator.CreateMemento());
                                        
        // 退回到第2版,
        theOriginator.SetMemento( theCaretaker.GetMemento("2"));
        theOriginator.ShowInfo();

        // 退回到第1版,
        theOriginator.SetMemento( theCaretaker.GetMemento("1"));
        theOriginator.ShowInfo();


        
    }
}

上一篇:PolarDB 并行查询深入剖析


下一篇:FastAPI快速搭建一个博客系统