最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、介紹

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

二、定義

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

三、使用場景

需要保存一個對象在某一個時刻的狀態(tài)或部分狀態(tài)。

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

四、備忘錄模式的UML類圖

UML類圖:

角色介紹:

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

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

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

五、簡單示例

對備忘錄模式來說,比較貼切的場景應(yīng)該是游戲中的存檔功能,該功能就是將游戲進度存儲到本地文件系統(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關(guān)", mCheckpoint) + "奮戰(zhàn)殺敵中");
    mLiftValue -= 10;
    System.out.println("進度升級了");
    mCheckpoint++;
    System.out.println("到達" + 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游戲類中,我們存儲了幾個關(guān)鍵字段,關(guān)卡、人物的生命值、武器,當(dāng)調(diào)用play函數(shù)玩游戲時,我們對關(guān)卡和人物的生命值進行修改。在該類中可以通過createMemoto函數(shù)來創(chuàng)建該用戶的備忘錄對象,也就是將自身的狀態(tài)保存到一個Memoto對象中。外部可以通過restore函數(shù)將CallOfDuty對象的狀態(tài)從備忘錄對象中恢復(fù)。

我們在來看下備忘錄對象,它只是存儲CallOfDuty對象的字段,具體代碼如下:

備忘錄類:

/**
 * 備忘錄類
 */
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 + "]";
  }
}

這是一個無狀態(tài)、無操作的實體類,只負(fù)責(zé)用來存儲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é)很簡單,就是負(fù)責(zé)管理Memoto對象,也就是備忘錄對象。

客戶端類:

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)殺敵中
進度升級了
到達第2關(guān)
--------------
退出前的游戲?qū)傩裕篊allOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
退出游戲
--------------
恢復(fù)后的游戲?qū)傩裕篊allOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
打游戲:第2關(guān)奮戰(zhàn)殺敵中

上述過程大致有如下4步:

(1)開始游戲,闖關(guān)升級;
(2)游戲退出之前進行存檔;
(3)退出游戲;
(4)重新啟動游戲,從存檔中恢復(fù)游戲進度。

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

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

1、onSaveInstanceState和onRestoreInstanceState

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

七、總結(jié)

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

優(yōu)點:

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

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

缺點:

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

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

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

相關(guān)文章

  • Android基于訊飛語音SDK實現(xiàn)語音識別

    Android基于訊飛語音SDK實現(xiàn)語音識別

    本例子是一個調(diào)用訊飛語音識別SDK的例子源碼是一個最純凈的Demo比較容易看懂。實現(xiàn)的是點擊按鈕開始語音監(jiān)聽,手機需要聯(lián)網(wǎng),2/3G的均可,希望本文對大家學(xué)習(xí)Android有所幫助
    2016-06-06
  • AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法

    AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法

    這篇文章主要介紹了 AndroidApk混淆編譯時,報告Error:Execution failed for task ‘:gviews:transformClassesAndResourcesWithProguardForRelease’.錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • ???????Android?H5通用容器架構(gòu)設(shè)計詳解

    ???????Android?H5通用容器架構(gòu)設(shè)計詳解

    這篇文章主要介紹了???????Android?H5通用容器架構(gòu)設(shè)計詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Android判斷定位功能是否可用的方法

    Android判斷定位功能是否可用的方法

    今天小編就為大家分享一篇Android判斷定位功能是否可用的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android重寫View并自定義屬性實例分析

    Android重寫View并自定義屬性實例分析

    這篇文章主要介紹了Android重寫View并自定義屬性的方法,結(jié)合實例形式較為詳細(xì)的分析了Android基于重寫View實現(xiàn)自定義屬性的相關(guān)布局與具體技巧,需要的朋友可以參考下
    2016-02-02
  • Android中回調(diào)接口的使用介紹

    Android中回調(diào)接口的使用介紹

    回調(diào)接口在完成某些特殊的功能時還是蠻有用的,下面為大家分享下具體的使用方法,感興趣的朋友可以參考下哈
    2013-06-06
  • Android獲取app應(yīng)用程序大小的方法

    Android獲取app應(yīng)用程序大小的方法

    本文通過一段代碼給大家介紹android獲取app應(yīng)用程序大小的方法,由于android對這種方法進行了封裝,我們沒有權(quán)限去調(diào)用這個方法,只能通過aidl,然后用java的反射機制去調(diào)用系統(tǒng)級方法,感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • Android實現(xiàn)短信、微信、微博分享功能

    Android實現(xiàn)短信、微信、微博分享功能

    微信、微博分享功能大家都體驗過吧,非常方便我們的生活,下面通過本文給大家介紹Android實現(xiàn)短信、微信、微博分享功能,需要的朋友參考下吧
    2017-12-12
  • Android自定義View實現(xiàn)餅狀圖帶動畫效果

    Android自定義View實現(xiàn)餅狀圖帶動畫效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實現(xiàn)餅狀圖帶動畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android轉(zhuǎn)場效果實現(xiàn)示例淺析

    Android轉(zhuǎn)場效果實現(xiàn)示例淺析

    這篇文章主要為大家介紹了Android轉(zhuǎn)場效果實現(xiàn)示例淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論

麻阳| 台安县| 榕江县| 云南省| 武义县| 彰化县| 香河县| 丰顺县| 武乡县| 沧州市| 青浦区| 垫江县| 桐柏县| 平顶山市| 马关县| 建德市| 巴林左旗| 诸暨市| 祁阳县| 青神县| 紫阳县| 抚顺市| 皋兰县| 孟津县| 仙桃市| 叙永县| 常德市| 逊克县| 海晏县| 阜阳市| 河北省| 巴南区| 平武县| 娱乐| 安多县| 宝鸡市| 汨罗市| 宣武区| 兰州市| 双鸭山市| 神木县|