转至http://www.cnblogs.com/qianxudetianxia/archive/2011/08/09/2133049.html
备忘录模式,在工作代码中,要么不用,要么经常用到。
举个例子,程序员喜欢写代码,coding,coding,这个时候它的状态是很high,但是每隔一段时间总要去上一下厕所,状态是放松relax,上完测试归来后又恢复到high的状态,继续coding。这个过程对于身后的老板来说,它默认同意你离开去上厕所,他也希望你回来后恢复high的状态继续工作,但是你在这个过程中上厕所的这件事,他是不需要了解细节的,而且做为当事人你也不希望他了解你上厕所的细节吧,你只要回来后恢复激情high着继续工作,老板应该就不会挑你的刺。
这就是备忘录模式。
本文今天就Canvas的一个save(),restore()操作分析一下,但是有一点,看完本文,如果不懂备忘录模式的,应该还是不懂,但是canvas是android的一场大戏,说一说它的特色,对深入学习android绝对有帮助。
学习备忘录模式,通过保存状态,恢复状态的内部实现,对了解一些莫名其妙的看上去无用其实很重要的操作有拨开云雾见青天的作用。
1.意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到先前保存的状态。
热门词汇:标记 状态 备忘录 原发器
2.结构和代码
组织者,把原发器的状态State(全部或者部分状态,一般是变量的值),通过CreateMemento()方法保存起来,继续运行后,等待合适的时机,在通过SetMemento()方法可以再次恢复到之前的状态。在这个过程中,我们并没有对这些状态做任何的访问和设置,实际上这些状态都是私有的,对外是禁止访问的,我们只是通过Memento对象的两个最简单的方法就达到了这个效果。Memento经常写成Originator的内部类。
在Android中,Canvas有两个方法 save()和restore()方法再做图形变换的时候使用的非常多,因为涉及到跨语言的问题,我不好就认定这个用的是备忘录模式,但是它的这种思想绝对是备忘录的思想。
我们来读一读它源代码的注释吧,首先看save()保存状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Canvas {
/**
* Saves the current matrix and clip onto a private stack. Subsequent
* calls to translate,scale,rotate,skew,concat or clip Rect,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.
*/
/**
*保存当前的矩阵和剪裁到一个私有的堆栈,其实矩阵和剪裁就是当前Canvas的状态State
*/
public native int save();
} |
再看恢复状态restore():
1
2
3
4
5
6
7
8
9
10
11
|
public class Canvas {
/**
* 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.
*/
/**
* 移除自上次保存操作后所做的修改,恢复到之前的状态,因为是堆栈实现,所以pull操作不能不等于push操作,save()和restore()应该成对使用,否则恢复的状态就很有可能是错误的
*/
public native void restore();
} |
从上面的两个方法中,它们实现了自我状态的恢复,实际上我们只是执行了两个没有接触任何内部信息的方法,实际上这两个方法就是在操作我们看不到的这些内部状态信息。
3.效果
(1).保持封装边界,把很复杂的原发器的内部信息对外部其他对象隐藏起来。
(2).简化的原发器,把状态操作无形中转化到客户手里,简化了原发器的某些实现。
(3).也要注意注意备忘录的管理代价。
相关推荐
opencv-4.5.4-android-sdk .zip
opencv-3.4.4-android-sdk/sdk/build.gradle opencv-3.4.4-android-sdk/sdk/etc opencv-3.4.4-android-sdk/sdk/java
标题中的"android-sdk-4.2.2 android-sdk-4.2.2-platforms"指的是Android SDK的一个特定版本,即Android 4.2.2(API级别17),该版本的SDK平台组件。这个版本是Android操作系统的 Jelly Bean 版本的一部分,发布于...
标题 "aip-ocr-android-sdk-1.4.4.zip" 暗示这是一个用于Android平台的OCR(光学字符识别)软件开发工具包,由百度公司提供,版本为1.4.4。这个SDK允许开发者集成到自己的应用程序中,实现图片中的文字自动识别功能...
本SDK是OpenCV的Android版本,版本号为4.1.0,适用于Android平台上的图像处理和计算机视觉应用开发。 在Android平台上使用OpenCV,开发者可以利用其强大的图像处理功能,如图像滤波、特征检测、图像变换、物体识别...
Android Framework Source Code , sdk19的源码,附关联方法: 打开Eclipse,随便新建一个Android项目,在此项目目录下面有个Android 4.4,点击展开遍出现了android.jar。右键此包---->Properties,在弹出的窗口中,...
sdkmanager是一个命令行工具,您可以用它来查看、安装、更新和卸载 Android SDK 的软件包。如果使用 Android Studio,则无需使用此工具,而可以从 IDE 管理 SDK 软件包。
taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码
5. **构建系统**:OpenCV Android SDK可能包含了用于构建和配置项目的文件,如CMakeLists.txt或Android.mk,这使得开发者可以将OpenCV库添加到他们的Android Studio项目中。 6. **预训练模型**:有时,OpenCV会附带...
android 4.1 最新SDK Windows版: http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-windows.zip(推荐) http://s1.eoeandroid.com/sdk/4.1/installer_r20-windows.exe Mac版: ...
android-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windowsandroid-sdk-windows
4. `java`目录:包含了OpenCV Android包装器的Java源码,方便在Java层调用OpenCV功能。 5. `docs`目录:可能有API文档和其他技术文档,帮助开发者理解如何使用OpenCV的API。 6. `build.gradle`或类似文件:可能包含...
Android-sceneform-android-sdk.zip,面向android的sceneform sdk,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
6. **Sources for Android SDK**:包含了 Android 源码,对开发者深入理解系统行为非常有帮助。 在实际开发中,开发者还需要设置 SDK 路径和 Android SDK Manager,这是一个图形界面工具,用于下载和管理所需的 SDK...
在Android SDK源码中,观察者模式被广泛应用于对象间的通信,例如数据变更时的通知机制。本文将深入探讨这种模式在Android中的应用,以AbstractCursor为例进行解析。 在观察者模式中,有两个关键角色:观察者...
opencv-3.4.4-android-sdk/sdk/native/3rdparty opencv-3.4.4-android-sdk/sdk/native/jni opencv-3.4.4-android-sdk/sdk/native/staticlibs
Android SDK (SDK Platforms)-android-34.zip 是一个包含了Android操作系统第34版本(也称为Android 13)开发所需平台工具的压缩包。这个压缩文件对于开发者来说至关重要,因为它提供了构建、测试和调试Android应用...
Android SDK (SDK Platforms)-android-30.zip 是一个包含了Android开发平台版本30的软件开发工具包,这是Android操作系统的一个重要组成部分,专为开发者提供,用于构建、测试和调试针对Android 11(API级别30)的...
3. **开发工具**:Android SDK还包括一系列开发工具,如ADT(Android Developer Tools)、SDK Manager、AAPT(Android Asset Packaging Tool)和Dalvik Debug Monitor Service等,这些工具帮助开发者构建、调试和...
Android SDK (SDK Platforms)-android-32.zip 是一个包含了Android操作系统第32版本(也称为Android 13)平台开发工具的压缩包。这个压缩文件是Android开发者在构建、测试和调试针对Android 13应用时所必需的核心...