在王者榮耀角度下分析面向對象程序設計B中23種設計模式之備忘錄模式

·

備忘錄模式在王者榮耀中的應用

·

一、簡述

在王者榮耀的遊戲中,賢者的庇護這件裝備設計的初衷是提高容錯率,常常出現在遊戲後期,玩家通過裝備賢者的庇護在危急時刻可以實現復活效果,進而保命。

二、備忘錄模式(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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章