日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式:备忘录模式(Memento)

發(fā)布時(shí)間:2024/4/11 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式:备忘录模式(Memento) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。


歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/design_pattern/memento/

在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將對(duì)象恢復(fù)到原先保存的狀態(tài)。

備忘錄模式的角色:

  • 原發(fā)器(Originator):負(fù)責(zé)創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前對(duì)象的內(nèi)部狀態(tài),通過(guò)也可以使用它來(lái)利用備忘錄回復(fù)內(nèi)部狀態(tài)。同時(shí)原發(fā)器還可以根據(jù)需要決定Memento存儲(chǔ)Originator的那些內(nèi)部狀態(tài)。
  • 備忘錄(Memento):用于存儲(chǔ)Originator的內(nèi)部狀態(tài),并且可以防止Originator以外的對(duì)象訪問(wèn)Memento。在備忘錄Memento中有兩個(gè)接口,其中Caretaker只能看到備忘錄中的窄接口,它只能將備忘錄傳遞給其他對(duì)象。Originator可以看到寬接口,允許它訪問(wèn)返回到先前狀態(tài)的所有數(shù)據(jù)。
  • 負(fù)責(zé)人(Caretaker):負(fù)責(zé)保存好備忘錄,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作和訪問(wèn),只能夠?qū)渫泜鬟f給其他對(duì)象。
  • 典型的備忘錄代碼:

    public class Memento {private String state;public Memento(Oraginator o){state = o.state;}public void setState(String state){this.state = state;}public String getState(){return this.state;} }

    ##案例
    大家一般都玩過(guò)游戲吧,就算沒(méi)玩過(guò)游戲也見(jiàn)過(guò)室友、朋友玩過(guò)游戲吧。很多游戲中需要存檔,保存當(dāng)前的血條和魔法值,以防再挑戰(zhàn)boss的時(shí)候die了可以重新讀檔。
    1 原發(fā)器Originator

    public class Originator {private int bloodValue;private int magicValue;public Originator(int bloodValue, int magicValue){this.bloodValue = bloodValue;this.magicValue = magicValue;}public int getBloodValue(){return bloodValue;}public void setBloodValue(int bloodValue){this.bloodValue = bloodValue;}public int getMagicValue(){return magicValue;}public void setMagicValue(int magicValue){this.magicValue = magicValue;}public void display(){System.out.println("用戶當(dāng)前狀態(tài):");System.out.println("血量:"+getBloodValue()+";藍(lán)量:"+getMagicValue());}public Memento saveMemento(){return new Memento(getBloodValue(),getMagicValue());}public void restoreMemento(Memento memento){this.bloodValue = memento.getBloodValue();this.magicValue = memento.getMagicValue();} }

    2 備忘錄Memento

    public class Memento {private int bloodValue;private int magicValue;public int getBloodValue(){return bloodValue;}public void setBloodValue(int bloodValue){this.bloodValue = bloodValue;}public int getMagicValue(){return magicValue;}public void setMagicValue(int magicValue){this.magicValue = magicValue;}public Memento(int bloodValue, int magicValue){this.bloodValue = bloodValue;this.magicValue = magicValue;} }

    3 負(fù)責(zé)人Caretaker

    public class Caretaker {private Memento memento;public Memento getMemento(){return memento;}public void setMemento(Memento memento){this.memento = memento;} }

    4 測(cè)試代碼

    Originator originator = new Originator(100,100);System.out.println("Before fighting BOSS...");originator.display();//存檔Caretaker caretaker = new Caretaker();caretaker.setMemento(originator.saveMemento());//FightingSystem.out.println("Fighting...");originator.setBloodValue(20);originator.setMagicValue(20);originator.display();//回復(fù)存檔System.out.println("Restore...");originator.restoreMemento(caretaker.getMemento());originator.display();

    輸出結(jié)果:

    Before fighting BOSS... 用戶當(dāng)前狀態(tài): 血量:100;藍(lán)量:100 Fighting... 用戶當(dāng)前狀態(tài): 血量:20;藍(lán)量:20 Restore... 用戶當(dāng)前狀態(tài): 血量:100;藍(lán)量:100

    在備忘錄模式中,最重要的就是備忘錄Memento了。備忘錄中存儲(chǔ)的就是原發(fā)器的部分或者所有的狀態(tài)信息,而這些狀態(tài)信息是不能夠被其它對(duì)象所訪問(wèn)的,也就是說(shuō)我們是不可能在備忘錄之外的對(duì)象來(lái)存儲(chǔ)這些狀態(tài)信息,如果暴漏了內(nèi)部狀態(tài)信息就違反了封裝的原則,故備忘錄是處理原發(fā)器外其它對(duì)象都是不可以訪問(wèn)的。

    優(yōu)缺點(diǎn)
    優(yōu)點(diǎn):

  • 給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制。可以是用戶能夠比較方便地回到某個(gè)歷史的狀態(tài)。
  • 實(shí)現(xiàn)了信息的封裝。使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。
    缺點(diǎn):
  • 消耗資源。如果類(lèi)的成員變量過(guò)多,勢(shì)必會(huì)占用比較大的資源,而且每一次保存都會(huì)消耗一定的內(nèi)存。
  • 適用場(chǎng)景

  • 需要保存一個(gè)對(duì)象在某一時(shí)刻的狀態(tài)或部分狀態(tài)
  • 如果用一個(gè)接口來(lái)讓其他對(duì)象得到這些狀態(tài),將會(huì)保留對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性,一個(gè)對(duì)象不希望外界直接訪問(wèn)其內(nèi)部狀態(tài),通過(guò)負(fù)責(zé)人可以間接訪問(wèn)其內(nèi)部狀態(tài)。
  • JDK中的備忘錄模式:
    java.util.Date(Date對(duì)象通過(guò)自身內(nèi)部的一個(gè)long值來(lái)實(shí)現(xiàn)備忘錄模式)
    java.io.Serializable

    參考資料

  • 23種設(shè)計(jì)模式
  • 細(xì)數(shù)JDK里的設(shè)計(jì)模式
  • 設(shè)計(jì)模式讀書(shū)筆記—–備忘錄模式
  • 歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/design_pattern/memento/

    歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。


    總結(jié)

    以上是生活随笔為你收集整理的设计模式:备忘录模式(Memento)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。