




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】Android中怎么實現(xiàn)備忘錄模式
這期內容當中在下將會給大家?guī)碛嘘PAndroid中怎么實現(xiàn)備忘錄模式,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。一、介紹備忘錄模式是一種行為模式,該模式用于保存對象當前狀態(tài),并且在之后可以再次恢復到此狀態(tài),這有點像我們平時說的”后悔藥“。備忘錄模式實現(xiàn)的方式需要保證被保存的對象狀態(tài)不能被對象從外部訪問,目的是為了保護好被保存的這些對象狀態(tài)的完整性以及內部實現(xiàn)不向外暴露。二、定義在不破壞封閉的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài),這樣,以后就可將該對象恢復到原先保存的狀態(tài)。三、使用場景需要保存一個對象在某一個時刻的狀態(tài)或部分狀態(tài)。如果用一個接口來讓其他對象得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性,一個對象不希望外界直接訪問其內部狀態(tài),通過中間對象可以間接訪問其內部狀態(tài)。四、備忘錄模式的UML類圖UML類圖:角色介紹:Originator:負責創(chuàng)建一個備忘錄,可以記錄、恢復自身的內部狀態(tài)。同時Originator還可以根據(jù)需要決定Memento存儲自身的哪些內部狀態(tài)。Memento:備忘錄角色,用于存儲Originator的內部狀態(tài),并且可以防止Originator以外的對象訪問Memento。Caretaker:負責存儲備忘錄,不能對備忘錄的內容進行操作和訪問,只能將備忘錄傳遞給其他對象。五、簡單示例對備忘錄模式來說,比較貼切的場景應該是游戲中的存檔功能,該功能就是將游戲進度存儲到本地文件系統(tǒng)或數(shù)據(jù)庫中,下次再次進入時從本地加載進度,使得玩家能夠繼續(xù)上一次的游戲之旅,這里我們就以”使命召喚“這款游戲為例來簡單演示一下備忘錄模式的實現(xiàn)。首先我們建立游戲類、備忘錄類、Caretaker類,玩游戲到某個節(jié)點對游戲進行存檔,然后退出游戲,再重新進入時從存檔中讀取進行,并且進入存檔時的進度。游戲類:/**
*
*
簡單模擬“使命召喚”游戲
*
*/
public
class
CallOfDuty
{
private
int
mCheckpoint
=
1;
private
int
mLiftValue
=
100;
private
String
mWeapon
=
"沙漠之鷹";
//玩游戲
public
void
play(){
System.out.println("打游戲:"+String.format("第%d關",
mCheckpoint)
+
"奮戰(zhàn)殺敵中");
mLiftValue
-=
10;
System.out.println("進度升級了");
mCheckpoint++;
System.out.println("到達"
+
String.format("第%d關",
mCheckpoint));
}
//退出游戲
public
void
quit(){
System.out.println("");
System.out.println("退出前的游戲屬性:"
+
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;
}
//恢復游戲
public
void
restore(Memento
memento){
this.mCheckpoint
=
memento.mCheckpoint;
this.mLiftValue
=
memento.mLiftValue;
this.mWeapon
=
memento.mWeapon;
System.out.println("恢復后的游戲屬性:"
+
this.toString());
}
//省略getter和setter方法
@Override
public
String
toString()
{
return
"CallOfDuty
[mCheckpoint="
+
mCheckpoint
+
",mLiftValue="
+
mLiftValue
+
",mWeapon="
+
mWeapon
+
"]";
}
}在CallOfDuty游戲類中,我們存儲了幾個關鍵字段,關卡、人物的生命值、武器,當調用play函數(shù)玩游戲時,我們對關卡和人物的生命值進行修改。在該類中可以通過createMemoto函數(shù)來創(chuàng)建該用戶的備忘錄對象,也就是將自身的狀態(tài)保存到一個Memoto對象中。外部可以通過restore函數(shù)將CallOfDuty對象的狀態(tài)從備忘錄對象中恢復。我們在來看下備忘錄對象,它只是存儲CallOfDuty對象的字段,具體代碼如下:備忘錄類:/**
*
備忘錄類
*/
public
class
Memento
{
public
int
mCheckpoint;//武器
public
int
mLiftValue;//生命
public
String
mWeapon;//關卡
@Override
public
String
toString()
{
return
"Memento
[mCheckpoint="
+
mCheckpoint
+
",mLiftValue="
+
mLiftValue
+
",mWeapon="
+
mWeapon
+
"]";
}
}這是一個無狀態(tài)、無操作的實體類,只負責用來存儲Originator角色的一些數(shù)據(jù),防止外部直接訪問Originator。而備忘錄的操作者則是Caretaker角色,我們看下相關代碼:Caretaker類:/**
*
Caretaker,負責管理Memento
*/
public
class
Caretaker
{
Memento
mMemento;
//備忘錄
/**
*
存檔
*/
public
void
archive(Memento
memento){
this.mMemento
=
memento;
}
/**
*
獲取存檔
*/
public
Memento
getMemento(){
return
mMemento;
}
}Caretaker類的職責很簡單,就是負責管理Memoto對象,也就是備忘錄對象??蛻舳祟悾簆ublic
class
Client
{
public
static
void
main(String[]
args)
{
//構建游戲對象
CallOfDuty
game
=
new
CallOfDuty();
//1.打游戲
game.play();
Caretaker
caretaker
=
new
Caretaker();
//2.游戲存檔
caretaker.archive(game.createMemento());
//3.退出游戲
game.quit();
//4.恢復游戲
CallOfDuty
newGame
=
new
CallOfDuty();
newGame.restore(caretaker.getMemento());
}
}結果:打游戲:第1關奮戰(zhàn)殺敵中
進度升級了
到達第2關
退出前的游戲屬性:CallOfDuty
[mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
退出游戲
恢復后的游戲屬性:CallOfDuty
[mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
打游戲:第2關奮戰(zhàn)殺敵中上述過程大致有如下4步:(1)開始游戲,闖關升級;(2)游戲退出之前進行存檔;(3)退出游戲;(4)重新啟動游戲,從存檔中恢復游戲進度。CallOfDuty在這里為Originator角色,也就是需要存儲數(shù)據(jù)的對象,在這里并沒有直接存儲CallOfDuty的對象,而是通過Memoto對CallOfDuty對象的數(shù)據(jù)進行存儲,然后在存儲Memoto對象,最終對Memoto的存取操作則交給Caretaker對象。在這個過程中,各個角色職責清晰、單一,代碼也比較簡單,即對外屏蔽了對CallOfDuty角色的直接訪問,在滿足了對象狀態(tài)存取功能的同時也使得該模塊的結構保持清晰、整潔。六、Android源碼中的備忘錄模式1、onSaveInstanceState和onRestoreInstanceState當Activity不是正常方式退出,且Activity在隨后的時間內被系統(tǒng)殺死之前會調用這兩個方法讓開發(fā)人員可以有機會存儲Activity相關信息,且在下次返回Activity時恢復這些數(shù)據(jù)。通過這兩個函數(shù)。開發(fā)人員能夠在某些特殊場景下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建對外經濟貿易職業(yè)技術學院《藥物生物技術》2023-2024學年第二學期期末試卷
- 《大戰(zhàn)中的插曲》教學設計 2023-2024學年統(tǒng)編版高中語文選擇性必修上冊
- 海南熱帶海洋學院《男裝設計》2023-2024學年第二學期期末試卷
- 山東政法學院《數(shù)字集成電路設計》2023-2024學年第二學期期末試卷
- 太原幼兒師范高等??茖W校《高級管理統(tǒng)計》2023-2024學年第二學期期末試卷
- 皖江工學院《專業(yè)技能訓練化學教學技能與訓練》2023-2024學年第二學期期末試卷
- 鄭州體育職業(yè)學院《室內空間設計公共》2023-2024學年第二學期期末試卷
- 吉林體育學院《生物工程專業(yè)分析》2023-2024學年第二學期期末試卷
- 河南2025年河南職業(yè)技術學院招聘30人筆試歷年參考題庫附帶答案詳解
- 免燒磚銷售合同范本
- 二手新能源汽車充電安全承諾書
- 醫(yī)學課件:介入放射學(全套課件328張)
- 水泥攪拌樁記錄表格范本
- DL∕T 458-2020 板框式旋轉濾網
- GB∕T 8163-2018 輸送流體用無縫鋼管
- 短視頻:策劃制作與運營課件
- T∕ASC 17-2021 電動汽車充換電設施系統(tǒng)設計標準
- 水閘設計步驟計算書(多表)
- PowerPoint使用技巧培訓課件(共35張)
- SMA瀝青路面的設計與施工
- 腎內科相關基礎知識學習教案
評論
0/150
提交評論