欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

介紹

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

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

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

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

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

實現(xiàn)

假設(shè)有一個游戲角色類Role,它有三個屬性:attack(攻擊力),defense(防御力)和hp(生命值).現(xiàn)在我們要實現(xiàn)一個備忘錄模式,可以保存角色的狀態(tài),并在需要時恢復(fù)角色的狀態(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;
    }
    /**
     * 將當(dāng)前對象儲存值Memento中
     * @return
     */
    public Memento save(){
        return new Memento(attack,defense,hp);
    }
    /**
     * 從memento中獲取狀態(tài);并恢復(fù)到當(dāng)前狀態(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));
        // 恢復(fù)
        role.restore(caretaker.getMemento(0));
        System.out.println(JSON.toJSONString(role));
    }
}

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

總結(jié)

優(yōu)點

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

缺點

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

應(yīng)用場景

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

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

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

相關(guān)文章

  • java編寫Http服務(wù)器下載工具

    java編寫Http服務(wù)器下載工具

    這篇文章主要介紹了java編寫Http服務(wù)器下載工具的方法,工具很簡單,功能也很簡單,代碼就更簡潔了,卻非常實用,有需要的小伙伴參考下吧。
    2015-03-03
  • idea中如何使用git進(jìn)行版本回退詳解

    idea中如何使用git進(jìn)行版本回退詳解

    工作中遇到git遠(yuǎn)程倉庫需要回退到歷史版本的問題,根據(jù)網(wǎng)上的搜索結(jié)果結(jié)合自己的實踐,下面這篇文章主要給大家介紹了關(guān)于idea中如何使用git進(jìn)行版本回退的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java中FileWriter類的常用方法說明

    Java中FileWriter類的常用方法說明

    這篇文章主要介紹了Java中FileWriter類的常用方法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot分布式整合dubbo的方式

    springboot分布式整合dubbo的方式

    Dubbo是一款高性能、輕量級的開源Java RPC框架,本文通過實例代碼給大家介紹springboot分布式整合dubbo的方式,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • springMVC如何防止表單重復(fù)提交詳解

    springMVC如何防止表單重復(fù)提交詳解

    平時開發(fā)的項目中經(jīng)常會遇到表單重復(fù)提交,造成數(shù)據(jù)重復(fù),增加服務(wù)器負(fù)載,嚴(yán)重甚至?xí)斐煞?wù)器宕機(jī),因此有效防止表單重復(fù)提交有一定的必要性,這篇文章主要給大家介紹了關(guān)于springMVC如何防止表單重復(fù)提交的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 如何通過zuul添加或修改請求參數(shù)

    如何通過zuul添加或修改請求參數(shù)

    這篇文章主要介紹了如何通過zuul添加或修改請求參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 最新評論