最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之備忘錄模式實現(xiàn)對象狀態(tài)的保存和恢復

 更新時間:2023年04月23日 08:31:51   作者:.番茄炒蛋  
本文介紹Java設計模式之備忘錄模式,該模式可以實現(xiàn)對象狀態(tài)的保存和恢復。通過詳細講解備忘錄模式的原理、實現(xiàn)方法和應用場景,幫助讀者深入理解該設計模式,并提供示例代碼和技巧,便于讀者實際應用

介紹

備忘錄模式(Memento Pattern)是一種行為型設計模式,它允許在不破壞封裝性的前提下,捕獲并保存一個對象的內(nèi)部狀態(tài),并在之后可以恢復該對象到先前的狀態(tài).該模式的核心是備忘錄(Memento)類,它儲存了一個對象的內(nèi)部狀態(tài).

在Java中,備忘錄模式可以通過定義一個備忘錄類來實現(xiàn).備忘錄類通常包含一個或多個私有字段來儲存要保存的對象的內(nèi)部狀態(tài).備忘錄類還可以提供公共方法來獲取和設置這些字段.原始對象可以使用備忘錄類創(chuàng)建備忘錄,并將其保存到歷史記錄中.在需要恢復對象的狀態(tài)時,原始對象可以從歷史記錄中獲取備忘錄,并使用備忘錄來恢復其狀態(tài).

在備忘錄模式中,一般會涉及到以下三個角色:

  • Originator(發(fā)起人):它是要被保存狀態(tài)的對象.它提供了創(chuàng)建備忘錄和恢復備忘錄的接口,允許其他對象獲取其內(nèi)部狀態(tài).
  • Memento(備忘錄):它用于儲存Originator內(nèi)部狀態(tài)得對象.備忘錄可以根據(jù)Originator得需求來保存其內(nèi)部狀態(tài),并且可以防止Originator以外得其他對象訪問該狀態(tài).
  • Caretaker(管理者):它負責保存?zhèn)渫?并在需要時將其提供給Originator進行恢復,Caretaker可以儲存多個備忘錄,以及支持多次撤銷操作.

在Java中實現(xiàn)備忘錄模式時,一般會涉及到以上三個角色.其中Originator和Memento是必需的,Caretaker可以根據(jù)實際需要來選擇是否實現(xiàn).

實現(xiàn)

假設有一個游戲角色類Role,它有三個屬性:attack(攻擊力),defense(防御力)和hp(生命值).現(xiàn)在我們要實現(xiàn)一個備忘錄模式,可以保存角色的狀態(tài),并在需要時恢復角色的狀態(tài).

備忘錄類

@Data
public class Memento {
    /**
     * 攻擊力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Memento(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
}

發(fā)起人類

@Data
public class Role {
    /**
     * 攻擊力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Role(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
    /**
     * 將當前對象儲存值Memento中
     * @return
     */
    public Memento save(){
        return new Memento(attack,defense,hp);
    }
    /**
     * 從memento中獲取狀態(tài);并恢復到當前狀態(tài)
     * @param memento
     */
    public void restore(Memento memento){
        attack = memento.getAttack();
        defense = memento.getDefense();
        hp = memento.getHp();
    }
}

管理者類

public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    public void addMemento(Memento m){
        mementos.add(m);
    }
    public Memento getMemento(int index){
        return mementos.get(index);
    }
}

測試

public class Demo {
    public static void main(String[] args) {
        Role role = new Role(100,50,20);
        Caretaker caretaker = new Caretaker();
        Memento memento = role.save();
        caretaker.addMemento(memento);
        // 攻擊力+10
        role.setAttack(role.getAttack()+10);
        System.out.println(JSON.toJSONString(role));
        // 恢復
        role.restore(caretaker.getMemento(0));
        System.out.println(JSON.toJSONString(role));
    }
}

這是一個完整的備忘錄模式的例子.在這個例子中,我們創(chuàng)建一個備忘錄類Memento,它保存了角色的攻擊力,防御力和生命值.我們還創(chuàng)建了一個角色類Role,它可以保存和恢復角色的狀態(tài).最后.我們創(chuàng)建了一個Caretaker類,它用于保存Memento對象.通過這些類的結(jié)合使用,我們實現(xiàn)了備忘錄模式.

總結(jié)

優(yōu)點

  • 可以實現(xiàn)對象狀態(tài)的保存和恢復,使得對象狀態(tài)的變化更加靈活可控.
  • 模式實現(xiàn)簡單,易于理解和使用.
  • 備忘錄對象和原始對象分離,保證了系統(tǒng)的封裝性.

缺點

  • 如果要保存的狀態(tài)數(shù)據(jù)量比較大,備忘錄對象可能會占用較大的內(nèi)存空間.
  • 如果需要保存的狀態(tài)比較頻繁,備忘錄對象的管理可能會變得比較復雜.

應用場景

  • 需要保存對象狀態(tài)的歷史記錄,以便后續(xù)回退到之前的某個狀態(tài),例如文本編輯器中的撤銷操作.
  • 需要對對象狀態(tài)進行備份和恢復的場景,例如數(shù)據(jù)庫中的事務管理.
  • 需要實現(xiàn)對象狀態(tài)的快照,一邊后續(xù)進行分析和統(tǒng)計,例如游戲中存檔和回放功能.

總之Java備忘錄模式適用于需要保存和恢復對象狀態(tài)的場景,可以幫助開發(fā)者更好地管理對象狀態(tài)的變化,提高系統(tǒng)的靈活性和可控性.

到此這篇關(guān)于Java設計模式之備忘錄模式實現(xiàn)對象狀態(tài)的保存和恢復的文章就介紹到這了,更多相關(guān)Java備忘錄模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

普定县| 成武县| 昌吉市| 崇阳县| 祥云县| 东丰县| 武穴市| 太康县| 龙里县| 富宁县| 丹阳市| 嫩江县| 平乡县| 凤凰县| 项城市| 建湖县| 定州市| 利川市| 林口县| 哈密市| 淳化县| 高青县| 河南省| 米脂县| 新化县| 河西区| 南充市| 探索| 上林县| 喀什市| 阿巴嘎旗| 河津市| 富源县| 长丰县| 当雄县| 西乌珠穆沁旗| 福安市| 共和县| 武城县| 西青区| 邢台市|