Android设计模式(十五)--备忘录模式

在Android中用于保存Activity状态的onSaveInstanceState()和恢复Activity状态的onRestoreInstanceState(),

这种算不算是一种备忘录模式呢?

1、定义:

在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态,这样以后就可以恢复以后保存的状态;

2、使用:

备忘录模式,比较适合用于功能复杂,但是需要维护和纪录历史的类,或者是需要保存一个或者是多个属性的类,

在未来某个时段需要时,将其还原到原来纪录的状态;

Originator可以根据保存的Memento还原到前一状态;

3、其他:

备忘录模式又称之为:快照模式(Snapshot Pattern)或Token模式,是对象的行为模式;

4、简单的demo:

首先是需要处理的对象数据:

package com.example.demo.Memento;
/**
 * 对象
 * @author qubian
 * @data 2015年6月20日
 * @email [email protected]
 *
 */
public class Bean {

	private String name;
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}

	public Memento createMemento(String name,String age)
	{
		return new Memento(name, age);
	}

	public void restore(Memento memento)
	{
		this.name=memento.getName();
		this.age= memento.getAge();
	}
}

备忘数据对象:

1、这个可以存储和被处理的对象一样的数据,也可以根据需要修改,设置自己的数据;

2、需要明确的功能仅仅是为了存储和恢复被处理的对象,故其中的数据可以随意约定,

3、那么,问题来了,这个备份的数据,一般都是存储在内存中,用于恢复对象,那么如果将被处理的对象,序列化,或者是运用反射等技术用于存储和恢复,那么这样存储在磁盘中,这样是否有意义,或者是违背了这样的设计模式呢?

4、也就是原来的问题,在Android中onSaveInstanceState中的数据,一般都是使用的Android的存储方式,是为了在Activity在内存中销毁后的恢复问题,那么备忘录模式中存储在内存的对象,在此时,似乎就没有什么意义了!?

package com.example.demo.Memento;
/**
 * 备忘录 备忘数据
 * @author qubian
 * @data 2015年6月20日
 * @email [email protected]
 *
 */
public class Memento {

	private String name;
	private String age;
	public Memento(String name,String age)
	{
		this.name=name;
		this.age= age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}

}

备忘录管理者以及使用者:

package com.example.demo.Memento;
/**
 * 备忘录模式
 * 管理者
 * @author qubian
 * @data 2015年6月20日
 * @email [email protected]
 *
 */
public class MementoManager {
	private Memento memento;

	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}

}

package com.example.demo.Memento;

public class UseMemento {

	public void use()
	{
		Bean bean  =new Bean();
		bean.setName("张三");
		bean.setAge("22");

		// 保存状态
		MementoManager manager  = new MementoManager();
		manager.setMemento(bean.createMemento(bean.getName(), bean.getAge()));

		// 改变状态
		bean.setAge("23");

		//恢复原来地状态
		bean.restore(manager.getMemento());

	}
}

在管理者其中,备忘数据对象Memento,可以放在管理者中统一管理;

在管理者中,也可以存在多种状态的Memento,上例子中,仅仅存放了一个简单的状态;

5、在备忘录模式的定义中,是说,在此对象之外保存这个对象的状态,那么,如果这么说来,存在内存和磁盘中,然后处理后返回原来的对象数据,这样似乎也都是一种备忘录模式咯?!

6、Android:

1、那么如果这么说来,Activity 本身就用到了这样的设计模式了,

2、在横竖屏切换的时候,线程Thread会重新启动,这个问题是横竖屏切换的时候需要处理的,那么,我们在此需要也是需要考虑的这么模式,就是线程重启的时候,线程中的数据,我们也是肯定需要用到这个模式的,用来保存原来的数据;

3、在JNI 调用本地数据中的Canvas中的Save() 和Restore()这两个本地JNI 代码中是否也运用这样的设计模式呢?!

public class Canvas {

    /**
     * Saves the current matrix and clip onto a private stack. Subsequent
     * calls to translate,scale,rotate,skew,concat or clipRect,clipPath
     * will all operate as usual, but when the balancing call to restore()
     * is made, those calls will be forgotten, and the settings that existed
     * before the save() will be reinstated.
     *
     * @return The value to pass to restoreToCount() to balance this save()
     */
    public native int save();

    /**
     * Based on saveFlags, can save the current matrix and clip onto a private
     * stack. Subsequent calls to translate,scale,rotate,skew,concat or
     * clipRect,clipPath will all operate as usual, but when the balancing
     * call to restore() is made, those calls will be forgotten, and the
     * settings that existed before the save() will be reinstated.
     *
     * @param saveFlags flag bits that specify which parts of the Canvas state
     *                  to save/restore
     * @return The value to pass to restoreToCount() to balance this save()
     */
    public native int save(int saveFlags);

    /**
     * This behaves the same as save(), but in addition it allocates an
     * offscreen bitmap. All drawing calls are directed there, and only when
     * the balancing call to restore() is made is that offscreen transfered to
     * the canvas (or the previous layer). Subsequent calls to translate,
     * scale, rotate, skew, concat or clipRect, clipPath all operate on this
     * copy. When the balancing call to restore() is made, this copy is
     * deleted and the previous matrix/clip state is restored.
     *
     * @param bounds May be null. The maximum size the offscreen bitmap
     *               needs to be (in local coordinates)
     * @param paint  This is copied, and is applied to the offscreen when
     *               restore() is called.
     * @param saveFlags  see _SAVE_FLAG constants
     * @return       value to pass to restoreToCount() to balance this save()
     */
    public int saveLayer(RectF bounds, Paint paint, int saveFlags) {
        return native_saveLayer(mNativeCanvas, bounds,
                paint != null ? paint.mNativePaint : 0,
                saveFlags);
    }
    /**
     * This call balances a previous call to save(), and is used to remove all
     * modifications to the matrix/clip state since the last save call. It is
     * an error to call restore() more times than save() was called.
     */
    public native void restore();

}
时间: 2024-11-05 22:36:34

Android设计模式(十五)--备忘录模式的相关文章

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式入门之备忘录模式Memento

//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就可以将该对象恢复到原先保存的状态 //实例:测试两种方案,两种方案在第一阶段的过程是相同的,第二阶段是不同的 //实例代码 //备忘录对象的窄接口 public interface FlowAMockMemento { //空的,所谓窄接口,即只是一个标识作用,它的持有者不可以调用任何它的方法 } //测试流程类 public class FlowAMock { private

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

Java设计模式菜鸟系列(十九)备忘录模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018967 备忘录模式(Memento): 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象. 一.uml建模: 二.代码实现 /** * 备忘录模式(Memento):主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象 * * 示例:原始类--> 创建.恢复备忘录 */ class Original { private String state; public Or

设计模式之十四:备忘录模式(Memento)

备忘录模式: 在不破换封装性的前提下,捕获一个对象的内部状态并将这个状态保存到对象外部,这样这个对象之后可以恢复到保存的状态. Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later UML图: 主要包括: Memento(Memento):存储Originator的内部状态.

大话设计模式第十八章--备忘录模式

<?php class Originator { private $state; public function __set($param, $value) { if ($param == 'state') { $this->state = $value; } } public function __get($param) { if ($param == 'state') { return $this->state; } } public function create_memento(

设计模式之:备忘录模式

前言: 这个国庆,回家不想学习,于是下了个三国志11,玩了好几天,终于从一个只有一个城池,5.6个武将,一两万士兵的刘备,发展成占有半壁江山了,灭了曹操,袁绍等,那在玩游戏的时候,我肯定不能连续几十个小时都不退出游戏,或者说不关机,那我每次肯定都需要保存游戏进度才能下次继续玩,那这就用上我这次要说的备忘录模式了,每次讲记录保存在存档里,下次进入游戏又可以接着上一次继续玩了~ 定义(源于GoF<设计模式>): 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可