国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式(22)---備忘錄模式

2019-11-14 16:14:52
字體:
來源:轉載
供稿:網友

基本定義

備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可以將該對象恢復到原先保存的狀態。

解釋:簡單來說,就是保存一個對象在某一時刻的特定狀態,在以后需要的時候可以將對象恢復到保存時的狀態。

 

基本代碼:

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 Display()        {            Console.WriteLine("State=" + state);        }    }    class Memento    {        private string state;        public string State        {            get { return state; }        }        public Memento(string state)        {            this.state = state;        }    }    class Caretaker    {        private Memento memento1;        public Memento Memento1        {            get { return memento1; }            set { memento1 = value; }        }    }
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 Display()        {            Console.WriteLine("State=" + state);        }    }    class Memento    {        private string state;        public string State        {            get { return state; }        }        public Memento(string state)        {            this.state = state;        }    }    class Caretaker    {        private Memento memento1;        public Memento Memento1        {            get { return memento1; }            set { memento1 = value; }        }    }

客戶端調用:

Originator originator = new Originator();            originator.State = "on";            originator.Display();            Caretaker caretaker = new Caretaker();            caretaker.Memento1 = originator.CreateMemento();            originator.State = "off";            originator.Display();            originator.SetMemento(caretaker.Memento1);            originator.Display();
View Code

 

列舉具體實例:

游戲,保存一角色在打boss前的狀態,待打boss結束后再恢復到它之前的狀態。

class Program    {        static void Main(string[] args)        {            Role role = new Role(100, 100);            Console.WriteLine("大戰前:");            role.Display();            Caretaker caretaker = new Caretaker();            caretaker.memento = role.SaveMemento();            role.SetBloodFlow(20);            role.SetMagicPoint(20);            Console.WriteLine("大戰");            role.Display();            role.RestoreMemento(caretaker.GetMemento());            Console.WriteLine("恢復");            role.Display();            Console.Read();        }    }    class Role    {        private int bloodFlow;        private int magicPoint;        public Role(int bloodFlow, int magicPoint)        {            this.bloodFlow = bloodFlow;            this.magicPoint = magicPoint;        }        public int GetBloodFlow()        {            return bloodFlow;        }        public void SetBloodFlow(int bloodFlow)        {            this.bloodFlow = bloodFlow;        }        public int GetMagicPoint()        {            return magicPoint;        }        public void SetMagicPoint(int magicPoint)        {            this.magicPoint = magicPoint;        }        public void Display()        {            Console.WriteLine("用戶當前的狀態:");            Console.WriteLine("血量:" + GetBloodFlow() + ";藍量:" + GetMagicPoint());        }        public Memento SaveMemento()        {            return new Memento(GetBloodFlow (),GetMagicPoint ());        }        public void RestoreMemento(Memento memento)        {            this.bloodFlow = memento.GetBloodFlow();            this.magicPoint = memento.GetMagicPoint();        }    }    class Memento    {        private int bloodFlow;        private int magicPoint;        public Memento(int bloodFlow, int magicPoint)        {            this.bloodFlow = bloodFlow;            this.magicPoint = magicPoint;        }        public int GetBloodFlow()        {            return bloodFlow;        }        public void SetBloodFlow(int bloodFlow)        {            this.bloodFlow = bloodFlow;        }        public int GetMagicPoint()        {            return magicPoint;        }        public void SetMagicPoint(int magicPoint)        {            this.magicPoint = magicPoint;        }    }    class Caretaker    {        public Memento memento;        public Memento GetMemento()        {            return memento;        }        public void SetMemento(Memento memento)        {            this.memento = memento;        }    }
View Code

 

備忘錄模式的優缺點及適用場景:

優點:

為用戶提供一種可以恢復狀態的機制,用戶比較方便的恢復到某個歷史狀態。

隱藏恢復細節,用戶不需要關心狀態的保存細節。

缺點:

對象狀態需要完整存儲到備忘錄對象中,如果狀態數據很大,那么在資源消耗上,備忘錄對象會非常耗內存。

適用場景:

簡單來說,顯現其優點回避其缺點的地方都可以使用備忘錄模式。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红河县| 张家港市| 湟中县| 襄垣县| 武定县| 石渠县| 惠州市| 于都县| 海安县| 循化| 南昌市| 大兴区| 冕宁县| 石景山区| 孙吴县| 革吉县| 西乌| 北宁市| 古田县| 白城市| 泰来县| 平湖市| 育儿| 阿瓦提县| 平遥县| 赞皇县| 嘉黎县| 绥化市| 乃东县| 黄大仙区| 长兴县| 湘乡市| 鹤岗市| 濮阳市| 东乡| 万全县| 江华| 南川市| 当阳市| 永顺县| 桦川县|