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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android设计模式之——备忘录模式

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

一、介紹

備忘錄模式是一種行為模式,該模式用于保存對(duì)象當(dāng)前狀態(tài),并且在之后可以再次恢復(fù)到此狀態(tài),這有點(diǎn)像我們平時(shí)說的”后悔藥“。備忘錄模式實(shí)現(xiàn)的方式需要保證被保存的對(duì)象狀態(tài)不能被對(duì)象從外部訪問,目的是為了保護(hù)好被保存的這些對(duì)象狀態(tài)的完整性以及內(nèi)部實(shí)現(xiàn)不向外暴露。

二、定義

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

三、使用場(chǎng)景

  • 需要保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的狀態(tài)或部分狀態(tài)。

  • 如果用一個(gè)接口來讓其他對(duì)象得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性,一個(gè)對(duì)象不希望外界直接訪問其內(nèi)部狀態(tài),通過中間對(duì)象可以間接訪問其內(nèi)部狀態(tài)。

四、備忘錄模式的UML類圖

UML類圖:

角色介紹:

  • Originator:負(fù)責(zé)創(chuàng)建一個(gè)備忘錄,可以記錄、恢復(fù)自身的內(nèi)部狀態(tài)。同時(shí)Originator還可以根據(jù)需要決定Memento存儲(chǔ)自身的哪些內(nèi)部狀態(tài)。

  • Memento:備忘錄角色,用于存儲(chǔ)Originator的內(nèi)部狀態(tài),并且可以防止Originator以外的對(duì)象訪問Memento。

  • Caretaker:負(fù)責(zé)存儲(chǔ)備忘錄,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作和訪問,只能將備忘錄傳遞給其他對(duì)象。

五、簡(jiǎn)單示例

對(duì)備忘錄模式來說,比較貼切的場(chǎng)景應(yīng)該是游戲中的存檔功能,該功能就是將游戲進(jìn)度存儲(chǔ)到本地文件系統(tǒng)或數(shù)據(jù)庫中,下次再次進(jìn)入時(shí)從本地加載進(jìn)度,使得玩家能夠繼續(xù)上一次的游戲之旅,這里我們就以”使命召喚“這款游戲?yàn)槔齺砗?jiǎn)單演示一下備忘錄模式的實(shí)現(xiàn)。

首先我們建立游戲類、備忘錄類、Caretaker類,玩游戲到某個(gè)節(jié)點(diǎn)對(duì)游戲進(jìn)行存檔,然后退出游戲,再重新進(jìn)入時(shí)從存檔中讀取進(jìn)行,并且進(jìn)入存檔時(shí)的進(jìn)度。

游戲類:

/*** * 簡(jiǎn)單模擬“使命召喚”游戲 * */public class CallOfDuty {private int mCheckpoint = 1;private int mLiftValue = 100;private String mWeapon = "沙漠之鷹";//玩游戲public void play(){System.out.println("打游戲:"+String.format("第%d關(guān)", mCheckpoint) + "奮戰(zhàn)殺敵中");mLiftValue -= 10;System.out.println("進(jìn)度升級(jí)了");mCheckpoint++;System.out.println("到達(dá)" + String.format("第%d關(guān)", mCheckpoint));}//退出游戲public void quit(){System.out.println("--------------");System.out.println("退出前的游戲?qū)傩?#xff1a;" + this.toString());System.out.println("退出游戲");System.out.println("--------------");}/***創(chuàng)建備忘錄 */public Memento createMemento(){Memento memento = new Memento();memento.mCheckpoint = mCheckpoint;memento.mLiftValue = mLiftValue;memento.mWeapon = mWeapon;return memento;}//恢復(fù)游戲public void restore(Memento memento){this.mCheckpoint = memento.mCheckpoint;this.mLiftValue = memento.mLiftValue;this.mWeapon = memento.mWeapon;System.out.println("恢復(fù)后的游戲?qū)傩?#xff1a;" + this.toString());}//省略getter和setter方法@Overridepublic String toString() {return "CallOfDuty [mCheckpoint=" + mCheckpoint + ",mLiftValue="+ mLiftValue + ",mWeapon=" + mWeapon + "]";} }

在CallOfDuty游戲類中,我們存儲(chǔ)了幾個(gè)關(guān)鍵字段,關(guān)卡、人物的生命值、武器,當(dāng)調(diào)用play函數(shù)玩游戲時(shí),我們對(duì)關(guān)卡和人物的生命值進(jìn)行修改。在該類中可以通過createMemoto函數(shù)來創(chuàng)建該用戶的備忘錄對(duì)象,也就是將自身的狀態(tài)保存到一個(gè)Memoto對(duì)象中。外部可以通過restore函數(shù)將CallOfDuty對(duì)象的狀態(tài)從備忘錄對(duì)象中恢復(fù)。

我們?cè)趤砜聪聜渫泴?duì)象,它只是存儲(chǔ)CallOfDuty對(duì)象的字段,具體代碼如下:

備忘錄類:

/*** 備忘錄類*/ public class Memento {public int mCheckpoint;//武器public int mLiftValue;//生命public String mWeapon;//關(guān)卡@Overridepublic String toString() {return "Memento [mCheckpoint=" + mCheckpoint + ",mLiftValue="+ mLiftValue + ",mWeapon=" + mWeapon + "]";}}

這是一個(gè)無狀態(tài)、無操作的實(shí)體類,只負(fù)責(zé)用來存儲(chǔ)Originator角色的一些數(shù)據(jù),防止外部直接訪問Originator。

而備忘錄的操作者則是Caretaker角色,我們看下相關(guān)代碼:

Caretaker類:

/*** Caretaker,負(fù)責(zé)管理Memento*/ public class Caretaker {Memento mMemento; //備忘錄/*** 存檔*/public void archive(Memento memento){this.mMemento = memento;}/*** 獲取存檔*/public Memento getMemento(){return mMemento;} }

Caretaker類的職責(zé)很簡(jiǎn)單,就是負(fù)責(zé)管理Memoto對(duì)象,也就是備忘錄對(duì)象。

客戶端類:

public class Client {public static void main(String[] args) {//構(gòu)建游戲?qū)ο?/span>CallOfDuty game = new CallOfDuty();//1.打游戲game.play();Caretaker caretaker = new Caretaker();//2.游戲存檔caretaker.archive(game.createMemento());//3.退出游戲game.quit();//4.恢復(fù)游戲CallOfDuty newGame = new CallOfDuty();newGame.restore(caretaker.getMemento());} }

結(jié)果:

打游戲:第1關(guān)奮戰(zhàn)殺敵中 進(jìn)度升級(jí)了 到達(dá)第2關(guān) -------------- 退出前的游戲?qū)傩?#xff1a;CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹] 退出游戲 -------------- 恢復(fù)后的游戲?qū)傩?#xff1a;CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹] 打游戲:第2關(guān)奮戰(zhàn)殺敵中

上述過程大致有如下4步:
(1)開始游戲,闖關(guān)升級(jí);
(2)游戲退出之前進(jìn)行存檔;
(3)退出游戲;
(4)重新啟動(dòng)游戲,從存檔中恢復(fù)游戲進(jìn)度。

CallOfDuty在這里為Originator角色,也就是需要存儲(chǔ)數(shù)據(jù)的對(duì)象,在這里并沒有直接存儲(chǔ)CallOfDuty的對(duì)象,而是通過Memoto對(duì)CallOfDuty對(duì)象的數(shù)據(jù)進(jìn)行存儲(chǔ),然后在存儲(chǔ)Memoto對(duì)象,最終對(duì)Memoto的存取操作則交給Caretaker對(duì)象。在這個(gè)過程中,各個(gè)角色職責(zé)清晰、單一,代碼也比較簡(jiǎn)單,即對(duì)外屏蔽了對(duì)CallOfDuty角色的直接訪問,在滿足了對(duì)象狀態(tài)存取功能的同時(shí)也使得該模塊的結(jié)構(gòu)保持清晰、整潔。

六、Android源碼中的備忘錄模式

1、onSaveInstanceState和onRestoreInstanceState

當(dāng)Activity不是正常方式退出,且Activity在隨后的時(shí)間內(nèi)被系統(tǒng)殺死之前會(huì)調(diào)用這兩個(gè)方法讓開發(fā)人員可以有機(jī)會(huì)存儲(chǔ)Activity相關(guān)信息,且在下次返回Activity時(shí)恢復(fù)這些數(shù)據(jù)。通過這兩個(gè)函數(shù)。開發(fā)人員能夠在某些特殊場(chǎng)景下儲(chǔ)存與界面相關(guān)的信息,提升用戶體驗(yàn)。

七、總結(jié)

備忘錄模式是在不破壞封裝的條件下,通過備忘錄對(duì)象(Memoto)存儲(chǔ)另外一個(gè)對(duì)象內(nèi)部狀態(tài)的快照,在將來合適的時(shí)候把這個(gè)對(duì)象還原到存儲(chǔ)起來的狀態(tài)。

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

  • 給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶能夠比較方便地回到某個(gè)歷史狀態(tài)。

  • 實(shí)現(xiàn)了信息的封裝,使用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。

缺點(diǎn):

  • 消耗資源,如果類的成員變量過多,勢(shì)必會(huì)占用比較大的資源,而且每一次保存都會(huì)消耗一定的內(nèi)存。

總結(jié)

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

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