Fragment 事务 回退栈
备忘录模式
简介
在不破坏封装的前提下,捕获一个对象的【内部状态】,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
角色:
- 发起人Originator:要被备份的成员,它提供一创建备忘录的方法,其实就是将它自身的某些信息拷贝一份放到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。
- 备忘录Memento:备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态。
- 管理角色Caretaker:用于管理备忘录对象的实现类。
适用场合:
- 它适用于对象在执行某些操作时,为防止意外,而在执行操作前,将对象状态备份的场景,有点类似于【事务回滚】的意思。
- 功能比较复杂的,但是需要维护或记录属性历史的类
- 需要保存的属性只是众多属性的一小部分时
好处:
- 有时一些发起人对象的内部信息必须【保存在】发起人对象以外的地方,但是必须要由发起人对象自己读取,这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持【封装】的边界
- 本模式【简化】了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本
- 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原
缺点:
- 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在【资源消耗】上面备忘录对象会很昂贵
- 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵
案例
发起人Originator,要【被备份】的类
public class Originator {
public String date; //需要被保存的内部状态
public int num; //需要被保存的内部状态
//提供一个【创建备忘录】的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中
public Memento createMemento() {
return new Memento(this); //备忘录持有当前对象的引用
}
public void setMemento(Memento memento) {
date = memento.date; //用备忘录中的信息覆盖自身信息
num = memento.num;
}
public void show() {
System.out.println(date + "---" + num);
}
}
备忘录Memento,备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态
public class Memento {
public String date;
public int num;
public Memento(Originator org) {
this.date = org.date;
this.num = org.num;
}
}
管理角色Caretaker,用于管理备忘录对象。不能对备忘录的内部进行操作或检查
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return this.memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
public class Test {
public static void main(String[] args) {
//原始数据
Originator org = new Originator();
org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
org.num = 99;
org.show();
//创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复
Memento memento = org.createMemento();
Caretaker ctk = new Caretaker(); //创建一个备忘录管理类,用于管理备忘录对象(其实基本没什么卵用)
ctk.setMemento(memento);
//改变原始数据的状态
org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
org.num = 100;
org.show();
//恢复之前保存的状态(将保存的数据导入)
org.setMemento(ctk.getMemento());
org.show();
}
}
去除掉管理类
public class Test {
public static void main(String[] args) {
Originator org = new Originator();//原始数据
//...对原始数据进行各种操作
Memento memento = org.createMemento(); //创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复
//...改变原始数据的状态
org.setMemento(memento);//恢复之前保存的状态(将保存的数据导入)
org.show();
}
}
2016-04-20
Fragment 事务 回退栈的更多相关文章
- fragment 事务回滚 ---动态创建fragment
import java.util.Date; import java.util.LinkedList; import com.qianfeng.gp08_day23_fragment5.fragmen ...
- Android零基础入门第89节:Fragment回退栈及弹出方法
在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一.回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状 ...
- Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView
Fragment回退栈 类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务 ...
- Fragment回退栈&commit()和commitAllowingStateLoss()
Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈,情况就会不一样了,它就有了类似Ac ...
- 清空Fragment回退栈中某个Fragment
出栈的方法:getActivity().getSupportFragmentManager().popBackStackImmediate(CreateOneFragment.class.getNam ...
- 清空Fragment回退栈中某个Fragment之上的所有Fragment
根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackSt ...
- Fragment事务管理源代码分析
转载请标明出处:http://blog.csdn.net/shensky711/article/details/53132952 本文出自: [HansChen的博客] 概述 在Fragment使用中 ...
- Fragment事务管理源码分析
转载请标明出处:http://blog.csdn.net/shensky711/article/details/53132952 本文出自: [HansChen的博客] 概述 在Fragment使用中 ...
- Android Fragment---执行Fragment事务
转载博客:http://blog.csdn.net/think_soft/article/details/7272853 在Activity中使用有关Fragment的添加.删除.替换以及用它们执行其 ...
随机推荐
- POJ 2438 (哈密顿回路)
分析: 2*n个小朋友,每个最多有n-1个"敌人",显然是存在哈密顿回路的. 预处理边,然后找哈密顿回路. code #include <iostream> #incl ...
- tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable
linux 下 启动tomcat 报: Neither the JAVA_HOME nor the JRE_HOME environment variable is definedAt least o ...
- 使用xshell出现乱码
用xshell链接Linux出现乱码: 解决方法: 先查看Linux支持的字符类型是否为如下类型 如果是,则找到菜单中的文件选项,并在选项中找到属性: 单击属性选项,找到终端,将编码设置为UTF-8: ...
- 基于jq插件开发及弹窗实例
基于jq的插件开发是什么鬼,$.fn是什么鬼,我在实际工作中也遇到过这个问题,下面就让我们一起来看一看这些都是什么鬼. 首先我们介绍$.fn. $.fn是指jquery的命名空间,加上fn上的方法及属 ...
- Tomcat安装阿里云免费证书
安装证书 Tomcat支持JKS格式证书,从Tomcat7开始也支持PFX格式证书,两种证书格式任选其一.下载包中包含PFX格式证书和密码文件. 1.PFX证书安装 找到安装 Tomcat 目录下该文 ...
- jquery 插件模版
;(function ($) { //插件的默认值属性 var defaults = { Weight: '300px', height: '230px', nextId: 'nextBtn', ne ...
- Python学习笔记:02数据类型
Python 数据类型 python中标准的数据类型有 基础类型 整型(长整型) 浮点型 复数型 布尔型 序列类型 字符串 列表 元组 字典 整型 整型和长整型并不严格区分,整型int的表达范围和计算 ...
- UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)
紫书例题p245 Piotr found a magical box in heaven. Its magic power is that if you place any red balloon i ...
- codeforces 305E Playing with String
刚开始你只有一个字符串每次能选择一个有的字符串s,找到i,满足s[i - 1] = s[i + 1],将其分裂成3 个字符串s[1 ·· i - 1]; s[i]; s[i + 1 ·· |s|] ...
- Egret 矢量绘图、遮罩、碰撞检测
矢量绘图: 1. 为矢量绘图绘制外边 - graphics.lineStype() private createGameScene():void { console.log("Runtime ...