亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android編程設(shè)計(jì)模式之備忘錄模式詳解

 更新時(shí)間:2017年12月26日 10:08:30   作者:蹲街式等待  
這篇文章主要介紹了Android編程設(shè)計(jì)模式之備忘錄模式,結(jié)合實(shí)例形式詳細(xì)分析了Android備忘錄模式的概念、原理、應(yīng)用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Android編程設(shè)計(jì)模式之備忘錄模式。分享給大家供大家參考,具體如下:

一、介紹

備忘錄模式是一種行為模式,該模式用于保存對(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類(lèi)圖

UML類(lèi)圖:

角色介紹:

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)。

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

游戲類(lèi):

/**
 *
 * 簡(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游戲類(lèi)中,我們存儲(chǔ)了幾個(gè)關(guān)鍵字段,關(guān)卡、人物的生命值、武器,當(dāng)調(diào)用play函數(shù)玩游戲時(shí),我們對(duì)關(guān)卡和人物的生命值進(jìn)行修改。在該類(lèi)中可以通過(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ì)象的字段,具體代碼如下:

備忘錄類(lèi):

/**
 * 備忘錄類(lèi)
 */
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í)體類(lèi),只負(fù)責(zé)用來(lái)存儲(chǔ)Originator角色的一些數(shù)據(jù),防止外部直接訪問(wèn)Originator。

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

Caretaker類(lèi):

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

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

客戶端類(lèi):

public class Client {
  public static void main(String[] args) {
    //構(gòu)建游戲?qū)ο?
    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)景下儲(chǔ)存與界面相關(guān)的信息,提升用戶體驗(yàn)。

七、總結(jié)

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

優(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)存。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android中Activity組件實(shí)例介紹

    Android中Activity組件實(shí)例介紹

    大家好,本篇文章主要講的是Android中Activity組件實(shí)例介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Android實(shí)現(xiàn)音頻條形圖效果(仿音頻動(dòng)畫(huà)無(wú)監(jiān)聽(tīng)音頻輸入)

    Android實(shí)現(xiàn)音頻條形圖效果(仿音頻動(dòng)畫(huà)無(wú)監(jiān)聽(tīng)音頻輸入)

    這篇文章主要介紹了Android實(shí)現(xiàn)音頻條形圖效果(仿音頻動(dòng)畫(huà)無(wú)監(jiān)聽(tīng)音頻輸入)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法

    Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法

    下面小編就為大家分享一篇Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Flutter實(shí)現(xiàn)打印功能的示例詳解

    Flutter實(shí)現(xiàn)打印功能的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)?Flutter?實(shí)現(xiàn)調(diào)用打印機(jī)打印的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Android圖像處理之霓虹濾鏡效果

    Android圖像處理之霓虹濾鏡效果

    這篇文章主要介紹了Android圖像處理之霓虹濾鏡效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android開(kāi)發(fā)Jetpack組件ViewModel與LiveData使用講解

    Android開(kāi)發(fā)Jetpack組件ViewModel與LiveData使用講解

    Jetpack是一個(gè)由多個(gè)技術(shù)庫(kù)組成的套件,可幫助開(kāi)發(fā)者遵循最佳做法,減少樣板代碼并編寫(xiě)可在各種Android版本和設(shè)備中一致運(yùn)行的代碼,讓開(kāi)發(fā)者精力集中編寫(xiě)重要的代碼
    2022-09-09
  • Android通用索引欄實(shí)現(xiàn)代碼

    Android通用索引欄實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android通用索引欄實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Flow轉(zhuǎn)LiveData數(shù)據(jù)丟失原理詳解

    Flow轉(zhuǎn)LiveData數(shù)據(jù)丟失原理詳解

    這篇文章主要為大家介紹了Flow轉(zhuǎn)LiveData數(shù)據(jù)丟失原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 基于Android MarginLeft與MarginStart的區(qū)別(詳解)

    基于Android MarginLeft與MarginStart的區(qū)別(詳解)

    下面小編就為大家分享一篇基于Android MarginLeft與MarginStart的區(qū)別(詳解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Android 開(kāi)源項(xiàng)目側(cè)邊欄菜單(SlidingMenu)使用詳解

    Android 開(kāi)源項(xiàng)目側(cè)邊欄菜單(SlidingMenu)使用詳解

    SlidingMenu的是一種比較新的設(shè)置界面或配置界面效果,在主界面左滑或者右滑出現(xiàn)設(shè)置界面,能方便的進(jìn)行各種操作.目前有大量的應(yīng)用都在使用這一效果。如Evernote、Google+、Foursquare等,國(guó)內(nèi)的豌豆夾,人人,360手機(jī)助手等都使用SlidingMenu的界面方案。
    2016-05-05

最新評(píng)論