備忘錄模式-在這如果我想做一個遊戲,以RPG來說,在進入遊戲戰鬥時我可以讓玩家選擇重新開始這場戰鬥,就像FFXIII玩家可以在戰鬥中隨時重新挑戰怪物更高分數、不同打法,
那該如何儲存腳色能力?
GameRole.cs:
1: class GameRole
2: {
3: private int hp;
4: public int HP
5: {
6: set{hp = value;}
7: get{return hp;}
8: }
9: }
10: public void StateDisplay()
11: {
12: Console.WriteLine("Now");
13: Console.WriteLine("HP:{0}",this.hp);
14: }
15: public void GetInitialize()
16: {
17: this.hp = 100;
18: }
19: public void End()
20: {
21: this.hp = 50;
22: }
23:
24: static void Main(string[] args)
25: {
26: GameRole playerRole = new GameRole();
27:
28: //Game Initialize
29: playerRole.GetInitialize();
30: playerRole.StateDisplay();
31:
32: //Enter a battle : Record Play's Val
33: GameRole backup = new GameRole();
34: playerRole.HP = backup.HP; //出現物件細節,Not good
35:
36: //Battle is done
37: playRole.End()
38: playRole.StateDisplay();
39:
40:
41: // I want Re battle
42: playerRole.HP = backup.HP; //出現物件細節,Not good
43: playRole.StateDisplay();
44:
45: Console.Read();
46: }
Memento Patterns:在不破壞封裝性的前提下,讀取一個物件的內部狀態,並在該物件之外保存這個狀態。可以讓物件回復到原先狀態保存狀態。
PlayerStateManager:根據狀態負責建立PlayerRecordManager,並同時記錄內部狀態,讓它可以用PlayerRecordManager回復狀態,StateManager可以決定RecordManager該存那些值與狀態。
PlayerRecordManager:負責存StateManager所需要的狀態與值,並防止其他物件存取RecordManager。RecordManager有兩個介面:
1.只能看到StateManager的窄介面,只能將值傳遞出去。
2.StateManager可以看到一個寬介面,允許存取恢復到先前的值。
PlayerRecorder:負責保存RecordManager,不能對其做任何檢查或操作。
其PlayerStateManager.cs:
1: class PlayerStateManager()
2: {
3: private string state;
4: public string State
5: {
6: get{return state;}
7: set{state = value;}
8: }
9: public PlayerRecordManager CreatePlayerRecordManager()
10: {
11: return (new PlayerRecordManager(state));
12: }
13: public void SetPlayerRecordManager(PlayerRecordManager recordManager)
14: {
15: state = recordManager.State;
16: }
17: public void Show()
18: {
19: //write out "State="+ state
20: }
21: }
PlayerRecordManager.cs:
1: class PlayerRecordManager
2: {
3: private string state;
4: public PlayerRecordManager(string state)
5: {
6: this.state = state;
7: }
8: public string State
9: {
10: get{return state;}
11: }
12: }PlayerRecorder.cs:
13:
14: class PlayerRecorder
15: {
16: private PlayerRecordManager playerRecordManager;
17:
18: public PlayerRecordManager PlayerRecordManager
19: {
20: get{return playerRecordManager;}
21: set{playerRecordManager = value;}
22: }
23: }
PlayerRecorder.cs:
1: class PlayerRecorder
2: {
3: private PlayerRecordManager playerRecordManager;
4:
5: public PlayerRecordManager PlayerRecordManager
6: {
7: get{return playerRecordManager;}
8: set{playerRecordManager = value;}
9: }
10: }
保存細節的目的是為了將細節封裝後,當需要更改保存細節時也不會影響到客戶端。
適用:
1.功能比較複雜但需要維護或記錄屬性歷史的類別。
2.需要保存的屬性只是眾多屬性中的一小部分,PlayerStateManager可以根據保存的PlayerRecordManager資訊還原到前一狀態。
缺點:
1.如果狀態資料很大量,在資源消耗上會非常耗記憶體。
1: class PlayerStateManager()
2: {
3: //........
4: public PlayerRecordManager SaveState()
5: {
6: return (new PlayerRecordManager(hp));
7: }
8: public void RecovertState(PlayerRecordManager recordManager)
9: {
10: this.hp = recordManager.HP;
11: }
12: //..........
13: }
1: class PlayerRecordManager
2: {
3: private int hp;
4: public PlayerRecordManager(int hp)
5: {
6: this.hp = hp;
7: }
8: public int HP
9: {
10: set{hp = value;}
11: get{return hp;}
12: }
13: }
1: class PlayerRecorder
2: {
3: private PlayerRecordManager playerRecordManager;
4:
5: public PlayerRecordManager PlayerRecordManager
6: {
7: get{return playerRecordManager;}
8: set{playerRecordManager = value;}
9: }
10: }
1: static void Main(string[] args)
2: {
3: PlayerStateManager player = new PlayerStateManager();
4:
5: player.GetInitState();
6: player.StateDisplay();
7:
8: //Backup State
9: PlayerRecorder stateAdmin = new PlayerRecorder();
10: stateAdmin.PlayerRecordManager = player.SaveState();
11:
12: player.End();
13: player.StateDisplay();
14:
15: player.RecoveryState(stateAdmin.PlayerRecordManager);
16: player.stateDisplay();
17: Console.Read();
18: }
No comments:
Post a Comment