1:主題拆解
①基本介紹
②如果王者榮耀中有月光寶盒
③備忘錄模式的優缺點
④適用場景
⑤應用實體
⑥總結
2:基本介紹

備忘錄模式:在不破壞封裝的前提下,捕獲一個物件的內部狀態,并在該物件之外保存這個狀態,這樣可以在以后將物件恢復到原先保存的狀態,
備忘錄模式保存的是我們關心的在恢復時需要的物件的部分狀態資訊,相當于快照,比如在玩游戲的時候有一個保存當前闖關的狀態的功能,會對當前用戶所處的狀態進行保存,當用戶闖關失敗或者需要從快照的地方開始的時候,就能讀取當時保存的狀態完整地恢復到當時的環境,這一點和VMware上面的快照功能很類似,
3:如果王者榮耀中有月光寶盒

在王者榮耀中,對時間點的把握非常重要,把握好之后就會贏得比賽先機,不管是拿buff還是搶暴君和主宰,都會快敵人一步,從而掌握更多的資源,獲取更大的經濟優勢,輕輕松松獲得比賽的勝利,游戲中有最重要的四個時間點,掌握好之后至少提升兩個段位!
這四個時間節點依次為 第一波野怪,第一條暴君,第一條暗影主宰,第一條黑暗暴君,
如果某一天王者榮耀添加一個道具月光寶盒,可以再隨時回傳到游戲的某個節點,重新彌補進度中的失誤,似乎是一個很好玩的腦洞,哈哈,
廢話不多說,開始擼碼
1:打臉版
①游戲英雄類
public class KingsGlory
{
public string Hero { get; set; }
public int Level { get; set; }
public string Army { get; set; }
public string Economic { get; set; }
public void Show()
{
Console.WriteLine("********************************");
Console.WriteLine(" Hero:{0}", this.Hero);
Console.WriteLine(" Level:{0}級", this.Level);
Console.WriteLine(" Army:{0}", this.Army);
Console.WriteLine(" Economic:{0}", this.Economic);
Console.WriteLine("********************************");
}
}
②游戲開始
List<KingsGlory> listKingsGlory = new List<KingsGlory>();
KingsGlory kingsGlory = new KingsGlory()
{
Hero = "甄姬-游夢驚園",
Level = 1,
Army = "法師*3 小兵*2",
Economic = "200"
};
listKingsGlory.Add(kingsGlory);
kingsGlory.Show();
Console.WriteLine("*****第一波野怪*******");
kingsGlory.Level = 3;
kingsGlory.Army = "法師*3 小兵*2";
kingsGlory.Economic = "1K";
listKingsGlory.Add(kingsGlory);
kingsGlory.Show();
Console.WriteLine("********月光寶盒**********");
kingsGlory = listKingsGlory[0];
kingsGlory.Show();
分析:想象美好,現實打臉,這里的kingsGlory是參考型別,在經過后面的賦值之后,實際上物件已經變化了,沒有保存,也沒法回歸到前面的進度,
2:重生一次
①添加備忘錄類
public class KingsGloryMemento
{
public int Level { get; private set; }
public string Army { get; private set; }
public string Economic { get; private set; }
public KingsGloryMemento(int level, string army, string economic)
{
this.Level = level;
this.Army = army;
this.Economic = economic;
}
}
②進度容器
public class Caretaker
{
private static KingsGloryMemento _KingsGloryMemento = null;
public static void SaveKingsGloryMemento(KingsGloryMemento kingsGloryMemento)
{
_KingsGloryMemento = kingsGloryMemento;
}
public static KingsGloryMemento GetKingsGloryMemento()
{
return _KingsGloryMemento;
}
}
③英雄類添加職責
public class KingsGlory
{
public string Hero { get; set; }
public int Level { get; set; }
public string Army { get; set; }
public string Economic { get; set; }
public void Show()
{
Console.WriteLine("********************************");
Console.WriteLine(" Hero:{0}", this.Hero);
Console.WriteLine(" Level:{0}級", this.Level);
Console.WriteLine(" Army:{0}", this.Army);
Console.WriteLine(" Economic:{0}", this.Economic);
Console.WriteLine("********************************");
}
public void Save()
{
KingsGloryMemento memento = new KingsGloryMemento(this.Level, this.Army, this.Economic);
Caretaker.SaveKingsGloryMemento(memento);
}
public void Load()
{
KingsGloryMemento memento = Caretaker.GetKingsGloryMemento();
this.Army = memento.Army;
this.Level = memento.Level;
this.Economic = memento.Economic;
}
}
④上端呼叫
KingsGlory kingsGlory = new KingsGlory()
{
Hero = "甄姬-游夢驚園",
Level = 1,
Army = "法師*3 小兵*2",
Economic = "200"
};
kingsGlory.Save();
kingsGlory.Show();
Console.WriteLine("*****第一波野怪*******");
kingsGlory.Level = 3;
kingsGlory.Army = "法師*3 小兵*2";
kingsGlory.Economic = "1K";
kingsGlory.Save();
kingsGlory.Show();
Console.WriteLine("********月光寶盒**********");
kingsGlory.Load();
kingsGlory.Show();
分析:由于把進度保持在第三方的容器Caretaker中,因此實作了進度回滾,但是我們可以看出此時保持了2次,但是結果只能回滾到最近的一次,如果要實作指定進度回滾該如何實作呢?
3:無限重生
①第三方容器添加進度條
public class Caretaker
{
private static Dictionary<string, KingsGloryMemento> _KingsGloryMementoDictionary = new Dictionary<string, KingsGloryMemento>();
public static void SaveKingsGloryMemento(string name, KingsGloryMemento kingsGloryMemento)
{
_KingsGloryMementoDictionary.Add(name, kingsGloryMemento);
}
public static KingsGloryMemento GetKingsGloryMemento(string name)
{
if (_KingsGloryMementoDictionary.ContainsKey(name))
return _KingsGloryMementoDictionary[name];
else
throw new Exception("wrong name");
}
}
②英雄職責調整,添加按照進度名稱回滾
public class KingsGlory
{
public string Hero { get; set; }
public int Level { get; set; }
public string Army { get; set; }
public string Economic { get; set; }
public void Show()
{
Console.WriteLine("********************************");
Console.WriteLine(" Hero:{0}", this.Hero);
Console.WriteLine(" Level:{0}級", this.Level);
Console.WriteLine(" Army:{0}", this.Army);
Console.WriteLine(" Economic:{0}", this.Economic);
Console.WriteLine("********************************");
}
public void Save(string name)
{
KingsGloryMemento memento = new KingsGloryMemento(this.Level, this.Army, this.Economic);
Caretaker.SaveKingsGloryMemento(name, memento);
}
public void Load(string name)
{
KingsGloryMemento memento = Caretaker.GetKingsGloryMemento(name);
this.Army = memento.Army;
this.Level = memento.Level;
this.Economic = memento.Economic;
}
}
③上端呼叫無限后悔
KingsGlory kingsGlory = new KingsGlory()
{
Hero = "甄姬-游夢驚園",
Level = 1,
Army = "法師*3 小兵*2",
Economic = "200"
};
kingsGlory.Save("Start");
kingsGlory.Show();
Console.WriteLine("*****第一波野怪*******");
kingsGlory.Level = 3;
kingsGlory.Army = "法師*3 小兵*2";
kingsGlory.Economic = "1K";
kingsGlory.Save("第一波野怪");
kingsGlory.Show();
Console.WriteLine("*****第一條暴君*******");
kingsGlory.Level = 5;
kingsGlory.Army = "法師*3 炮車*2";
kingsGlory.Economic = "3K";
kingsGlory.Show();
kingsGlory.Save("第一條暴君");
Console.WriteLine("*****第一條暗影主宰*******");
kingsGlory.Level = 8;
kingsGlory.Army = "超級兵*5";
kingsGlory.Economic = "5K";
kingsGlory.Show();
kingsGlory.Save("第一條暗影主宰");
Console.WriteLine("*****第一條黑暗暴君*******");
kingsGlory.Level = 12;
kingsGlory.Army = "主宰先鋒*1";
kingsGlory.Economic = "10K";
kingsGlory.Show();
kingsGlory.Save("第一條黑暗暴君");
Console.WriteLine("********月光寶盒**********");
kingsGlory.Load("Start");
kingsGlory.Show();
kingsGlory.Load("第一波野怪");
kingsGlory.Show();
kingsGlory.Load("第一條暴君");
kingsGlory.Show();
kingsGlory.Load("第一條暗影主宰");
kingsGlory.Show();
kingsGlory.Load("第一條黑暗暴君");
kingsGlory.Show();
④運行結果

4:備忘錄模式的優缺點
1:優點
①狀態恢復
備忘錄模式提供了一種狀態恢復的實作機制,使得用戶可以方便地回到一個特定的歷史狀態,
②多次撤銷
備忘錄實作了對資訊的封裝,保存了原發器的狀態,配合串列,堆疊等集合可以實作多次撤銷操作,
2:缺點
①資源消耗大
如果需要保存的原發器狀態太多,將會占用大量的存盤空間,每保存一次物件的狀態都需要消耗一定的系統資源,
5:適用場景
①保存一個物件在某一個時刻的全部狀態或部分狀態,這樣以后需要時就能恢復到先前的狀態,實作撤銷操作
②防止外界物件破壞一個物件歷史狀態的封裝性,避免將歷史狀態的實作細節暴露給外部物件
6:應用實體
word檔案的備份檔案
虛擬機的鏡像
下棋的悔棋動作
單機游戲的進度保持與加載
7:總結
人生沒有彩排,每一天都是精彩的比賽,每一天都是現場直播,過去不會重來,未來無法預知,月光寶盒也不會等你1萬年,接下來的日子,都請珍惜,把握好每次演出,便是對人生最好的珍惜,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301720.html
標籤:其他
上一篇:WLAN加密技術詳解
下一篇:TCP協議
