本文实例讲述了Android编程设计模式之备忘录模式。分享给大家供大家参考,具体如下:

一、介绍

备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的”后悔药“。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。

二、定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。

三、使用场景

需要保存一个对象在某一个时刻的状态或部分状态。

如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

四、备忘录模式的UML类图

UML类图:

角色介绍:

Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态。同时Originator还可以根据需要决定Memento存储自身的哪些内部状态。

Memento:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。

Caretaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能将备忘录传递给其他对象。

五、简单示例

对备忘录模式来说,比较贴切的场景应该是游戏中的存档功能,该功能就是将游戏进度存储到本地文件系统或数据库中,下次再次进入时从本地加载进度,使得玩家能够继续上一次的游戏之旅,这里我们就以”使命召唤“这款游戏为例来简单演示一下备忘录模式的实现。

首先我们建立游戏类、备忘录类、Caretaker类,玩游戏到某个节点对游戏进行存档,然后退出游戏,再重新进入时从存档中读取进行,并且进入存档时的进度。

游戏类:

/**

*

* 简单模拟“使命召唤”游戏

*

*/

public class CallOfDuty {

private int mCheckpoint = 1;

private int mLiftValue = 100;

private String mWeapon = "沙漠之鹰";

//玩游戏

public void play(){

System.out.println("打游戏:"+String.format("第%d关", mCheckpoint) + "奋战杀敌中");

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("--------------");

}

/**

*创建备忘录

*/

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函数玩游戏时,我们对关卡和人物的生命值进行修改。在该类中可以通过createMemoto函数来创建该用户的备忘录对象,也就是将自身的状态保存到一个Memoto对象中。外部可以通过restore函数将CallOfDuty对象的状态从备忘录对象中恢复。

我们在来看下备忘录对象,它只是存储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 + "]";

}

}

这是一个无状态、无操作的实体类,只负责用来存储Originator角色的一些数据,防止外部直接访问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对象,也就是备忘录对象。

客户端类:

public 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关奋战杀敌中

进度升级了

到达第2关

--------------

退出前的游戏属性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鹰]

退出游戏

--------------

恢复后的游戏属性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鹰]

打游戏:第2关奋战杀敌中

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

(1)开始游戏,闯关升级;

(2)游戏退出之前进行存档;

(3)退出游戏;

(4)重新启动游戏,从存档中恢复游戏进度。

CallOfDuty在这里为Originator角色,也就是需要存储数据的对象,在这里并没有直接存储CallOfDuty的对象,而是通过Memoto对CallOfDuty对象的数据进行存储,然后在存储Memoto对象,最终对Memoto的存取操作则交给Caretaker对象。在这个过程中,各个角色职责清晰、单一,代码也比较简单,即对外屏蔽了对CallOfDuty角色的直接访问,在满足了对象状态存取功能的同时也使得该模块的结构保持清晰、整洁。

六、Android源码中的备忘录模式

1、onSaveInstanceState和onRestoreInstanceState

当Activity不是正常方式退出,且Activity在随后的时间内被系统杀死之前会调用这两个方法让开发人员可以有机会存储Activity相关信息,且在下次返回Activity时恢复这些数据。通过这两个函数。开发人员能够在某些特殊场景下储存与界面相关的信息,提升用户体验。

七、总结

备忘录模式是在不破坏封装的条件下,通过备忘录对象(Memoto)存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。

优点:

给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史状态。

实现了信息的封装,使用户不需要关心状态的保存细节。

缺点:

消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

java备忘录模式 类图,Android编程设计模式之备忘录模式详解相关推荐

  1. android 状态模式,Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...

  2. android 多闹钟实现代码,Android编程实现闹钟的方法详解

    Android编程实现闹钟的方法详解 发布时间:2020-09-30 10:18:02 来源:脚本之家 阅读:75 作者:Jacob-wj 本文实例讲述了Android编程实现闹钟的方法.分享给大家供 ...

  3. java一个方法排他调用_Java编程实现排他锁代码详解

    一 .前言 某年某月某天,同事说需要一个文件排他锁功能,需求如下: (1)写操作是排他属性 (2)适用于同一进程的多线程/也适用于多进程的排他操作 (3)容错性:获得锁的进程若Crash,不影响到后续 ...

  4. android 程序类图,Android模板设计模式之 - 构建整个应用的BaseActivity

    1. 模式介绍 模式的定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式的使用场景 多个子类有公有的方法,并且逻辑基本相 ...

  5. android 编程 闹钟,Android编程实现闹钟的方法详解

    本文实例讲述了Android编程实现闹钟的方法.分享给大家供大家参考,具体如下: 在Android中,有一个闹钟的类,AlarmManager类,我们可以通过其来对系统内的通知进行操作! 本文用到了S ...

  6. java并发类_Java并发编程之常用的辅助类详解

    1.CountDownLatch 1.2.示例:班长锁门问题 问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门.班长必须要等所有人都走光了,班长才能关灯锁门.这6个同学的顺序是无序的 ...

  7. java备忘录模式 类图,【java设计模式】备忘录模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...

  8. java 外观模式类图_Java 设计模式——外观模式

    概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...

  9. 如何在类图中标注设计模式(二)

    接文章<如何在类图中标注设计模式(一)>. 本文姗姗来迟,见谅!        5.  基于标记的模式标注 美国德克萨斯大学达拉斯分校的Jing Dong等人提出了一种基于标记的模式标注方 ...

最新文章

  1. dede列表分页php,dede列表页分页英文调用方法
  2. 基于Spring+SpringMVC+MyBatis框架的分页查询
  3. 利用Python来玩扫雷,极致的思维体验
  4. CSRF 攻击的对象
  5. mysql+keepalived实现双主自由切换
  6. 数据结构(十七)数组和矩阵
  7. Vue/ElementUI上传文件检验
  8. 偷偷盘点一下各大公司的实习薪资
  9. matlab拓扑图画法,告诉你漂亮标准的网络拓扑图是怎么画出来的?
  10. Quartz任务监控管理
  11. Xilinx zynqmp VCU使用
  12. day26_安卓基础之之Android介绍与入门
  13. mysql rls_DBMS_RLS包实现数据库表行级安全控制
  14. 几款漂亮的Eclipse编辑器皮肤
  15. 便携式明渠流量计(比对装置)——适用于四种基本堰槽
  16. LwIP常见问题FAQ
  17. php通用图像处理库imagine使用
  18. 串口控制语音模块XY-V17B
  19. 04【竞品分析】的定义,分类,竞品分析报告怎么写?项目规划?
  20. 关于第二界“中科杯”全国软件设计大赛

热门文章

  1. c语言的数据类型可分为4种,C语言数据类型中的基本类型
  2. Minecraft 1.18.1、1.18.2模组开发 16.种植作物(crop)
  3. find 命令的 7 种用法
  4. 看了做人收获感悟笔记
  5. 2014年iTunes Connect放假安排及开发者注意事项
  6. XP安装pythonxy的问题
  7. Rolex宣传片赏析
  8. 2022茶艺师(中级)操作证考试题库及模拟考试
  9. 开发者即服务:开发者的被按需即用
  10. vs2010 安装boost