【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)備忘錄模式_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余2頁(yè)可下載查看

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論