下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式
這期內(nèi)容當(dāng)中在下將會(huì)給大家?guī)?lái)有關(guān)Android中怎么實(shí)現(xiàn)備忘錄模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。一、介紹備忘錄模式是一種行為模式,該模式用于保存對(duì)象當(dāng)前狀態(tài),并且在之后可以再次恢復(fù)到此狀態(tài),這有點(diǎn)像我們平時(shí)說(shuō)的”后悔藥“。備忘錄模式實(shí)現(xiàn)的方式需要保證被保存的對(duì)象狀態(tài)不能被對(duì)象從外部訪問(wèn),目的是為了保護(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è)接口來(lái)讓其他對(duì)象得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性,一個(gè)對(duì)象不希望外界直接訪問(wèn)其內(nèi)部狀態(tài),通過(guò)中間對(duì)象可以間接訪問(wèn)其內(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ì)象訪問(wèn)Memento。Caretaker:負(fù)責(zé)存儲(chǔ)備忘錄,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作和訪問(wèn),只能將備忘錄傳遞給其他對(duì)象。五、簡(jiǎn)單示例對(duì)備忘錄模式來(lái)說(shuō),比較貼切的場(chǎng)景應(yīng)該是游戲中的存檔功能,該功能就是將游戲進(jìn)度存儲(chǔ)到本地文件系統(tǒng)或數(shù)據(jù)庫(kù)中,下次再次進(jìn)入時(shí)從本地加載進(jìn)度,使得玩家能夠繼續(xù)上一次的游戲之旅,這里我們就以”使命召喚“這款游戲?yàn)槔齺?lái)簡(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ū)傩裕?
+
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ū)傩裕?
+
this.toString());
}
//省略getter和setter方法
@Override
public
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)行修改。在該類中可以通過(guò)createMemoto函數(shù)來(lái)創(chuàng)建該用戶的備忘錄對(duì)象,也就是將自身的狀態(tài)保存到一個(gè)Memoto對(duì)象中。外部可以通過(guò)restore函數(shù)將CallOfDuty對(duì)象的狀態(tài)從備忘錄對(duì)象中恢復(fù)。我們?cè)趤?lái)看下備忘錄對(duì)象,它只是存儲(chǔ)CallOfDuty對(duì)象的字段,具體代碼如下:備忘錄類:/**
*
備忘錄類
*/
public
class
Memento
{
public
int
mCheckpoint;//武器
public
int
mLiftValue;//生命
public
String
mWeapon;//關(guān)卡
@Override
public
String
toString()
{
return
"Memento
[mCheckpoint="
+
mCheckpoint
+
",mLiftValue="
+
mLiftValue
+
",mWeapon="
+
mWeapon
+
"]";
}
}這是一個(gè)無(wú)狀態(tài)、無(wú)操作的實(shí)體類,只負(fù)責(zé)用來(lái)存儲(chǔ)Originator角色的一些數(shù)據(jù),防止外部直接訪問(wèn)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ū)ο?/p>
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ū)傩裕篊allOfDuty
[mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
退出游戲
恢復(fù)后的游戲?qū)傩裕篊allOfDuty
[mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
打游戲:第2關(guān)奮戰(zhàn)殺敵中上述過(guò)程大致有如下4步:(1)開(kāi)始游戲,闖關(guān)升級(jí);(2)游戲退出之前進(jìn)行存檔;(3)退出游戲;(4)重新啟動(dòng)游戲,從存檔中恢復(fù)游戲進(jìn)度。CallOfDuty在這里為Originator角色,也就是需要存儲(chǔ)數(shù)據(jù)的對(duì)象,在這里并沒(méi)有直接存儲(chǔ)CallOfDuty的對(duì)象,而是通過(guò)Memoto對(duì)CallOfDuty對(duì)象的數(shù)據(jù)進(jìn)行存儲(chǔ),然后在存儲(chǔ)Memoto對(duì)象,最終對(duì)Memoto的存取操作則交給Caretaker對(duì)象。在這個(gè)過(guò)程中,各個(gè)角色職責(zé)清晰、單一,代碼也比較簡(jiǎn)單,即對(duì)外屏蔽了對(duì)CallOfDuty角色的直接訪問(wèn),在滿足了對(duì)象狀態(tài)存取功能的同時(shí)也使得該模塊的結(jié)構(gòu)保持清晰、整潔。六、Android源碼中的備忘錄模式1、onSaveInstanceState和onRestoreInstanceState當(dāng)Activity不是正常方式退出,且Activity在隨后的時(shí)間內(nèi)被系統(tǒng)殺死之前會(huì)調(diào)用這兩個(gè)方法讓開(kāi)發(fā)人員可以有機(jī)會(huì)存儲(chǔ)Activity相關(guān)信息,且在下次返回Activity時(shí)恢復(fù)這些數(shù)據(jù)。通過(guò)這兩個(gè)函數(shù)。開(kāi)發(fā)人員能夠在某些特殊場(chǎng)景下
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝圖案版權(quán)出售協(xié)議
- 產(chǎn)品陳列合作協(xié)議書(shū)
- 2024年購(gòu)買(mǎi)水泵合同范本
- 商場(chǎng)移交協(xié)議書(shū)2024年
- 房屋轉(zhuǎn)租合同范文標(biāo)準(zhǔn)
- 辦公室店鋪合租協(xié)議
- 專業(yè)裝修合同示例
- 2024年打井合同文檔
- 個(gè)人汽車(chē)抵押借款合同書(shū)范本的條款解讀
- 個(gè)人裝修合作意向協(xié)議
- 鈦合金相變及表征方法
- 湖北省十堰市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 個(gè)人收入證明免費(fèi)打印
- 部編人教版八年級(jí)上冊(cè)語(yǔ)文期末復(fù)習(xí)課件(專題三 名著閱讀)
- 《對(duì)校園欺凌說(shuō)“不”》教學(xué)課件-《心理健康教育》七年級(jí)下冊(cè)
- GB∕T 8163-2018 輸送流體用無(wú)縫鋼管
- 人教版八年級(jí)物理上冊(cè)課件:4.1光的直線傳播(共23張PPT)
- 鋼混組合梁施工方案
- 課件《“多元一體”視域下的中國(guó)古代民族關(guān)系》
- 初中班主任三年工作規(guī)劃8篇
- DB11-T 1796-2020文物建筑三維信息采集技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論