什么是备忘录模式

所谓备忘录模式,就是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后可将这个对象恢复到原先保存的状态的设计模式。

备忘录模式的实现方式

 

备忘录模式的实现方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。

民族英雄文天祥《正气歌》记载了一个“在齐太史简”的故事,我们先定义一个历史类:

public class History {

private String[] recorders = {"太史伯","太史仲","太史叔","太史季","南史氏"};
    private int record_num = 0;//被崔杼杀害的史官数量
    private String truth = "崔杼弑其君";

public History(int record_num) {
        this.record_num = record_num;
    }

/**
     * 发生
     */
    public void happen(){
        Log.e("历史事件发生",truth);
    }

/**
     * 记录
     */
    public Memoto record(){
        Log.e(recorders[record_num] + "书曰",truth);
        Memoto memoto = new Memoto(truth);
        return memoto;
    }

/**
     * 史官遇害
     */
    public void killRecorder(){
        truth = "暴病而死";
        Log.e("崔杼杀害"+recorders[record_num] + ",妄图篡改历史",truth);
    }

/**
     * 前赴后继
     */
    public void recordAgain(Memoto memoto){
        this.truth = memoto.getTruth();
        Log.e(recorders[record_num] + "嗣书",truth);
    }

}

记载真相的备忘录:

public class Memoto {

private String truth;

public Memoto(String truth) {
        this.truth = truth;
    }

public String getTruth() {
        return truth;
    }
}

备忘录的操作者Caretaker:

public class Caretaker {

Memoto memoto;

public void archive(Memoto memoto){
        this.memoto = memoto;
    }

public  Memoto getMemoto(){
        return memoto;
    }

}

“在齐太史简”的全过程:

History history_0 = new History(0);
history_0.happen();

Caretaker caretaker = new Caretaker();

caretaker.archive(history_0.record());
history_0.killRecorder();

History history_1 = new History(1);
history_1.recordAgain(caretaker.getMemoto());
history_1.killRecorder();

History history_2 = new History(2);
history_2.recordAgain(caretaker.getMemoto());
history_2.killRecorder();

History history_3 = new History(3);
history_3.recordAgain(caretaker.getMemoto());

无独有偶,秦始皇灭赵之后第一件事就是把赵国的史书全部烧毁,可是那句“某年月日,秦王为赵王击缻”还是被司马迁记录下来,千古流传,这也是现实中的备忘录模式的功劳。

Android源码中的备忘录模式

(1)onSaveInstanceState

当某个Activity变得容易被系统销毁时,该Activity的onSaveInstanceState方法就会被执行,除非该Activity是被用户主动销毁的。

Android开发中如何利用备忘录模式

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

(2)备忘录模式实现了信息的封装,使得用户不需要关心状态的保存细节。

需要注意的几个问题

(1)备忘录模式的缺点在于消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

转载于:https://blog.51cto.com/dongfeng9ge/2043982

【设计模式与Android】备忘录模式——在齐太史简相关推荐

  1. 读书笔记:在齐太史简,在晋董狐笔

    吾是近代以来,第一个自称的传统史家.想在自我介绍的时候,就需要介绍一下传统史家是怎么回事.于是就想到了这个典故.这是文天祥的正气歌中的两句. 在齐太史简 <左传>记载: 大史书曰:'崔杼弑 ...

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

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  3. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

  4. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  5. 一天一种设计模式之二-----备忘录模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.备忘录模式 备忘录模式属于三种设计模式中的行为型模式(另外两种是创建型模式和结构型模式). 定义:在不破坏封闭性的前提下, ...

  6. java备忘录代码和解释_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  7. 《研磨设计模式》chap19 备忘录模式

    应用场景:需要保存对象的状态和值. 1. 简介 public interface Memento { }public class Originator {//表示原发器的状态 private Stri ...

  8. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

  9. 设计模式读书笔记-----备忘录模式

    个人比较喜欢玩单机游戏,什么仙剑.古剑.鬼泣.使命召唤.三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传),对于这些游戏除了剧情好.场面大.爽快之外,还可以随时存档,等到下次想玩了又可以从刚开始的 ...

最新文章

  1. 改进C#代码之24:通过定义并实现接口替代继承
  2. Flask驱动的静态站点生成器(译)
  3. OpenCV中霍夫直线变换
  4. 10.傅里叶变换——更正式的傅里叶变换,频谱,局限性,离散傅里叶变换_4
  5. 商业医疗险住院报销需要什么材料?
  6. 约瑟夫环(C语言实现)
  7. ctfmon是什么启动项_电脑启动项没有ctfmon怎么办_win7启动项没有ctfmon的处理方法...
  8. TIF转PDF--itextpdf
  9. 网站标签页如何添加左边的小图标
  10. 解决Mac电脑连接校园网不弹出登陆窗口问题汇总
  11. 关于补码与booth算法的想法与逻辑推导
  12. MCU之芯唐ARM9(转)
  13. c语言直线和椭圆的交点,直线与椭圆交点距离公式
  14. candence测量尺寸
  15. 禁止div被拖动 css,【Web前端问题】div在拖动时出现禁止图标
  16. 对IPv6的理解以及其与IPv4的区别
  17. 【zhailu】国外产品经理到底在做些什么?【转载内容】
  18. vue router连续点击多次路由报错
  19. JAVA开发与运维(docker运维常规操作)
  20. 【POJ 1475】 Pushing Boxes

热门文章

  1. 脑电图分类任务中深度神经网络模型的数据增强:综述2021
  2. 如何通过Creo在曲面上写字
  3. 汽车与计算平台产业链
  4. linux ffmpeg 3gp mp4,利用ffmpeg转换3gp文件
  5. 【TWVRP】基于matlab模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】
  6. SQL Server 2008存储结构----不胜人生一场醉
  7. 电芯上料机,PLC是基恩士KV8000,用了一个16轴定位控制模块
  8. long类型时间转换string
  9. 2018年9月11日英语学习
  10. MySQL数据库 实验报告(二)