备忘录模式

备忘录模式,望文生义就知道它是用来做备忘的,或者可以直接说是“备份”。当需要保存当前状态,以便在不久要恢复此状态时,就可以使用“备忘录模式”。将当前”状态“备份,是不是又new一个类,然后将每个字段方法copy过去就可以了呢?或者说使用我们之前clone方法做深复制浅复制呢?其实不然,在《大话设计模式》中,作者提到了原因,这样会暴露更多的细节给客户端,不符合我们面向对象的思想。什么是暴露更多的细节给客户端?我们来看下面一段代码。

 1 package day_27_memento;
 2
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月27日
 7  */
 8 public class Client {
 9
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         /*状态一*/
15         Test nowTest = new Test();
16         nowTest.setField("状态一");
17
18         /*备份状态*/
19         Test backUpTest = new Test();
20         backUpTest.setField(nowTest.getField());
21
22         /*修改状态一*/
23         nowTest.setField("修改状态一,改为状态二");
24
25         /*还原状态*/
26         nowTest.setField(backUpTest.getField());
27     }
28
29 }

Test类中只有一个field字段,不再贴出代码。由上代码我们可以看到,如果要备份的字段较多,在客户端里就会暴露过多的细节。而我们希望的是,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这句话的后面两句是啥意思呢?捕获一个对象的内部状态——值得是要获得需要备份的状态(或者简单理解为字段),该备份状态要保存在另外一个类并要有对象自己来读取。

我们还是先来看代码。在备忘录模式中涉及到三个基本的类,一个是原始类,即需要备份的状态类,一个是备份类,即具体存储状态,还有一个管理者,用来提供备份状态类。

首先实现原始类,在这个类里除去该类本身自有的方法,还要有一个创建备份和获取备份的两个方法。

 1 package day_27_memento;
 2
 3 /**
 4  * 发起人,它要负责创建一个备忘录Memento用来记录当前时刻它的状态
 5  * @author turbo
 6  *
 7  * 2016年9月27日
 8  */
 9 public class Originator {
10     private String state;
11
12     public String getState() {
13         return state;
14     }
15
16     public void setState(String state) {
17         this.state = state;
18     }
19
20     /**
21      * 显示状态
22      */
23     public void show(){
24         System.out.println("state : " + state);
25     }
26
27     /**
28      * 创建备忘录
29      * @return 备份的状态
30      */
31     public Memento createMemento(){
32         return (new Memento(state));  //在这句我们可以看到将状态细节封装在了内部,对外部透明。
33     }
34
35     /**
36      * 获取备份
37      * @param memento 备份类
38      */
39     public void setMememto(Memento memento){
40         state = memento.getState();
41     }
42 }

备忘类。

 1 package day_27_memento;
 2
 3 /**
 4  * 备忘类
 5  * @author turbo
 6  *
 7  * 2016年9月27日
 8  */
 9 public class Memento {
10     private String state;
11
12     public String getState() {
13         return state;
14     }
15
16     public Memento(String state){
17         this.state = state;
18     }
19 }

接着来看看这个管理者类。

 1 package day_27_memento;
 2
 3 /**
 4  * 管理者
 5  * @author turbo
 6  *
 7  * 2016年9月27日
 8  */
 9 public class Caretaker {
10     private Memento memento;
11
12     public Memento getMemento() {
13         return memento;
14     }
15
16     public void setMemento(Memento memento) {
17         this.memento = memento;
18     }
19
20 }

管理者类就是用来提供备忘录类的。最后我们来看客户端代码。

 1 package day_27_memento;
 2
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月27日
 7  */
 8 public class Main {
 9     public static void main(String[] args){
10         /*当前状态*/
11         Originator originator = new Originator();
12         originator.setState("On");
13         originator.show();
14         /*备份当前状态*/
15         Caretaker caretaker = new Caretaker();
16         caretaker.setMemento(originator.createMemento());
17         /*更新状态*/
18         originator.setState("Off");
19         originator.show();
20         /*备份状态*/
21         originator.setMememto(caretaker.getMemento());
22         originator.show();
23     }
24 }

从代码16行、21行,我们能看到实际上就是书中所说,“有时一些对象的内部信息必须保存在对象以外的地方,但是必须要由对象自己读取”。

时间: 2024-10-24 10:16:19

备忘录模式的相关文章

Java设计模式应用——备忘录模式

备忘录模式主要用于存档.游戏中我们打boss前总会存档,如果打boss失败,则读取存档,重新挑战boss. 可以看出来,备忘录模式一般包括如下数据结构 1. 存档文件:用于恢复备份场景的必要数据: 2. 存档管理器:用于管理存档,包括存档的读写与展示: 3. 被存档的对象. 下面以射击游戏的存档来举例: 1. 射击选手 package com.coshaho.learn.memorandum; // 射击手 public class Shooter { // 血量 private int blo

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

4 行为型模式之- 备忘录模式

备忘录模式介绍: 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的"后悔"药.备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外界访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露 备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将对象恢复到原先的状态 对于备忘录模式来说,比较贴切的场景应该是游戏中的存档功能,该功能就是将游戏进度存储到

设计模式(12)---备忘录模式

备忘录模式   Memento (行为型模式) 1.概述 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 例如:一些软件提供的撤销功能,游戏的存档读档功能. 2.结构图 3.代码 1 /* 2 * 原发器类 Originator 3 */ 4 public class Role { 5 6 private int level ; 7 private int life ; 8 9 public Role() { 10

备忘录模式(Memento Pattern)

备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象. 例子: public class Memento { public String state; public Memento(String state){ this.state = state; } public String getState() { return state; } } public class MementoManager { public List<Memento> list = new ArrayList&

设计模式之备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 类图: 结构: 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据. 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态. 管理角色:对备忘录进行管理,保存和提供备忘录. 优点: 当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原. 备份的状态是保存在发起人角色之外的,

“备忘录模式”就这么简单

备忘录模式的官方定义: 在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之外保存这些状态.这样以后就可以通过该对象恢复到原先保存的状态. 大白话说: 一个对象中一般都封装了很多属性,这些属性的值会随着程序的运行而变化.当我们需要保存某一时刻对象的某些值的时候,我们就再创建一个对象,将当前对象中的一些属性保存到新的对象中,当我们需要恢复的时候再从新的对象中取出属性值即可.这种想法就是备忘录模式. 备忘录模式的类图: 1.需要备份的类是Orginator,备份的数据保存在Mementor中

设计模式之行为型模式—— 3.7 备忘录模式

<?php /**  * 3.7 备忘录模式  *  定义:  *  在不破坏封装性的前提下,捕获一个对象的内  *  部状态,并在该对象之外保存这个状态,这样  *  以后就可将该对象恢复到原先保存的状态.  *  * 角色:  *  1. 发起人(Originator)类  *  职责:负责创建一个备忘录Memento,用以  *    记录当前时刻它的内部状态,并可  *    使用备忘录恢复内部状态.Originator  *    可根据需要决定Memento存储它的哪  *    些

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

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