·
備忘錄模式在王者榮耀中的應用
·
一、簡述
在王者榮耀的遊戲中,賢者的庇護這件裝備設計的初衷是提高容錯率,常常出現在遊戲後期,玩家通過裝備賢者的庇護在危急時刻可以實現復活效果,進而保命。
二、備忘錄模式(Memento Pattern)
備忘錄模式理解:
高度概括:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到原先保存的狀態。
給定一個語言,定義他的文法的一種表示並定義一個解釋器,這個解釋器使用該表是來解釋語言中的句子。
對象的狀態依賴於它的變量的取值情況,對象在程序運行期間的各個時刻可能具有不同的狀態,在某些應用中,程序可能需要使用一種合理的方式來保存對象,在某一時刻的狀態,以便在需要時對象能恢復到原先保存的狀態,在備忘錄模式中稱需要保存狀態的對象爲原發者,稱負責保存原發者狀態的對象爲備忘錄,稱負責管理備忘錄的對象爲負責人,備忘錄模式要求原發者可以訪問備忘錄中的細節,即可以訪問備忘錄中的數據,以便恢復原發者的狀態,而負責人只能保存和得到備忘錄,但訪問備忘錄中的數據受到一定的限制,備忘錄模式使原發者可以將自己的狀態暴露給備忘錄,但其他對象想要獲得備忘錄中的數據,會受到一定的限制,這就保證了原發者暴露內部數據的同時,又保證了數據的封裝性,另外,經過精心設計的備忘錄,在保存原發者狀態時,可能只需要保存原發者的部分變量即可。也就是說,備忘錄通過保存原發者狀態中最本質的數據,就能使原發者根據此備忘錄中的數據,恢復原始狀態。
備忘錄模式結構中的三種角色:
①原發者(Originator):需要在某個時刻保存其狀態的對象,原發者負責創建備忘錄,比如使用createMemento()方法,創建一個備忘錄,然後原發者使用該備忘錄記錄自己的狀態,當原發者需要恢復某個時刻的狀態時,它通過獲得相應備忘錄中的數據來恢復那個時刻的狀態,比如原發者調用restoreFromMemento(Memento mem)方法,並通過參數mem指定的備忘錄恢復狀態;
②備忘錄(Memento):負責存儲原發者狀態的對象,創建備忘錄的類和創建原發者的類在同一個包中,該類提供的訪問數據的方法都是友好方法,使得只有和原發者在同一個包中的類的實例,纔可以訪問備忘錄中的數據;
③負責人(Caretaker):負責管理保存備忘錄的對象,負責人如果不合原發者在同一個包中,就不能對備忘錄中的內容進行修改或讀取,如果需要將備忘錄保存到磁盤,負責人可以使用對象劉將備忘錄寫入文件。
備忘錄模式的UML類圖:
備忘錄模式的優缺點:
優點:
①備忘錄模式使用備忘錄可以把原發者的內部狀態保存起來,使只有很親密的對,可以訪問備忘錄中的數據;
②備忘錄模式強調人類設計單一責任原則,即將狀態的刻畫和保存分開;
缺點:
如果備忘錄需要存儲大量的數據或非常頻繁的創建備忘錄,可能會導致非常大的存儲開銷
備忘錄模式的適用情景:
①必須保存一個對象在某一時刻的全部或部分狀態,以便在需要時恢復該對象先前的狀態;
②一個對象不想通過提供public權限的,諸如getXXX()的方法讓其他對象得到自己的內部狀態。
三、王者榮耀角度下實現備忘錄模式結構圖及代碼
eclipse結構圖
主函數【應用(Application)】
Applicayion.java
package angle_mementoPattern;
import angle_mementoPattern.Caretaker;
import angle_mementoPattern.Originator;
public class Application {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
System.out.println("★★★當玩家裝備中有{賢者的庇護}時★★★");
originator.setState("alive");
System.out.println(" →玩家狀態:" + originator.getState());
caretaker.saveMemento(originator.createMemento());
System.out.println("");
System.out.println("★★★玩家被擊殺時,觸發裝備效果★★★");
originator.setState("death");
System.out.println(" →玩家狀態:" + originator.getState());
originator.restoreMemento(caretaker.retrieveMemento());
System.out.println("");
System.out.println("★★★裝備出發效果2秒後★★★");
System.out.println(" →玩家狀態:" + originator.getState());
}
}
原發者(Originator)
Originator,java
package angle_mementoPattern;
import angle_mementoPattern.Memento;
public class Originator {
private String state;
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
}
備忘錄(Memento)
Memento.java
package angle_mementoPattern;
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
}
負責人(Caretaker)
Caretaker.java
package angle_mementoPattern;
import angle_mementoPattern.Memento;
public class Caretaker {
private Memento memento;
public Memento retrieveMemento() {
return this.memento;
}
public void saveMemento(Memento memento) {
this.memento = memento;
}
}
運行結果截圖
更多設計模式在王者榮耀中的應用請點擊我的→設計模式在王者榮耀中的應用專欄。
歡迎留言,一起學習交流~
感謝閱讀
END