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

什么是备忘录模式

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

备忘录模式的实现方式

 

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

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


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

时间: 2024-11-06 07:44:10

【设计模式与Android】备忘录模式——在齐太史简的相关文章

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

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

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

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

设计模式之:备忘录模式

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

《java设计模式》之备忘录模式

备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式的结构 备忘录模式的结构图如下所示 备忘录模式所涉及的角色有三个:备忘录(Memento)角色.发起人(Originator)角

[设计模式-行为型]备忘录模式(Memento)

一句话 让某个对象可以取到之前的某个状态值. 概括 解析 MEMENTO-同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦. 备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态. 实例 这个实例就以状态值

设计模式14:备忘录模式

备忘录模式适用于功能比较复杂的,但需要维护或者记录属性的类,对象可以根据备忘录回滚到上一状态. 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 客户不与备忘录类耦合,与备忘录管理类耦合. uml: 代码: public class Memento { private String state = null; public Memento(String state) { this.state = state;

设计模式学习之备忘录模式(Memento,行为型模式)(19)

假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { static void Main(string[] args) { Person person = new Person("张三", "男", 25); //保存内部状态 Person personBackup = new Person(); personBackup

2018/12/10《大话设计模式》【备忘录模式】

1:为什么要使用备忘录模式? - 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. - 在平常的需要备忘/快照的模式中,经常需要客户端来进行操作来进行复杂操作保存等逻辑. - 哎~,这个越说越晦涩,就这么说吧,不用修改基类,你想保存这个对象之前的状态,就是用这个就好了 - 就类似备忘录一样 2:备忘录模式的应用场景? - 在<大话涉及模式中也指出> - 适合功能比较复杂的历史功能这样的类,或者简单存储的属性. 3:备忘录

设计模式漫谈之备忘录模式

最近很长时间没写博客了,其实这个博客写过一半,中间有事耽搁了,就没继续.主要是给别人做了一个小系统,及维护码云上的代码库.同居的日子也占了我很多时间. 最近也是烦,欠了7W,各种烦事.所以可想写个博客静静心. 在面向对象中关注的焦点是对象空间,对象与对象的联系还是通过保存引用(相当于路),来走到其空间中. 在对象中是有空间的,空间里放的肯定是数据或者是命令. 备忘录就是把A对象的空间数据,备份到B对象空间一份.如果A对象与B对象是一个类型的对象,未免浪费B对象的空间,因为我是个性保存数据的,不一