【设计模式】—— 备忘录模式Memento

简介:

  模式意图

  这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复。

  该模式还有跟多可以扩展的地方,比如可以记录多个时间的状态,每个角色都有可以扩展的空间,完全看业务场景而定。

  应用场景

  1 保存对象某一时刻的状态

  2 避免直接暴露接口,破坏封装性

  模式结构

  Originator 是备忘录的发起者,记录状态的对象

复制代码
class Originator{
    private String state;
    public Memento ceateMemento() {
        return new Memento(state);
    }
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
    public String getState(){
        return this.state;
    }
    public void setState(String state){
        this.state = state;
        System.out.println("Current state = "+this.state);
    }
}
复制代码

  Memento 备忘录角色,通常用于保存某种状态

复制代码
class Memento{
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
复制代码

  Caretaker 备忘录的负责人,负责在恰当的时机,进行状态的恢复

复制代码
class Caretaker{
    private Memento memento;
    public Memento retrieveMemento(){
        return this.memento;
    }
    public void saveMemento(Memento memento){
        this.memento = memento;
    }
}
复制代码

  全部代码

复制代码
package com.xingoo.test.design.memento;
class Originator{
    private String state;
    public Memento ceateMemento() {
        return new Memento(state);
    }
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
    public String getState(){
        return this.state;
    }
    public void setState(String state){
        this.state = state;
        System.out.println("Current state = "+this.state);
    }
}
class Memento{
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}
class Caretaker{
    private Memento memento;
    public Memento retrieveMemento(){
        return this.memento;
    }
    public void saveMemento(Memento memento){
        this.memento = memento;
    }
}
public class Client {
    private static Originator o = new Originator();
    private static Caretaker c = new Caretaker();
    public static void main(String[] args) {
        o.setState("On");
        //记录状态
        c.saveMemento(o.ceateMemento());
        //更改状态
        o.setState("Off");
        //更新状态
        o.restoreMemento(c.retrieveMemento());
    }
}
复制代码

  运行结果

Current state = On
Current state = Off

  生活中的设计模式

 

  最近看了会 恶魔奶爸,挺扯淡的漫画。不过看到其中的女仆,让我想起了这种备忘录模式。

  主人在有什么重要的事情时,都会交给女仆记着,规定的时间在提醒自己。

  下面的主人就有一件很重要的事情,就是陪亲爱的小丽去看电影,于是他弄了一个笔记本,记录下了这个信息。女仆拿到笔记本,并在预先商量好的时间提醒主人。这里的笔记本就是上面的备忘录对象Memento,而这个模式中,主人就是备忘录的发起者,女仆是负责人。

  这里涉及到的备忘录是属于【白箱】的,也就是说,备忘录中的信息,可以被发起人和负责人看到。还有一种是【黑箱】的,主要是用了一种内部类继承这个备忘录对象,这样外部的负责人就得不到真正备忘录中的具体信息

  下面看下具体的实现,主人的代码如下:

复制代码
 1 class Master{
 2     private String info;
 3     public String getInfo() {
 4         return info;
 5     }
 6     public void setInfo(String info) {
 7         this.info = info;
 8     }
 9     public Note createNote(String info){
10         return new Note(info);
11     }
12     public void action(Note note){
13         this.info = note.getInfo();
14         System.out.println("主人看到笔记,记起了 "+ this.info);
15     }
16     public void toDo(){
17         System.out.println("****主人正在..."+info);
18     }
19 }
复制代码

  女仆的代码如下:

复制代码
 1 class Maid{
 2     private Note note;
 3     public Note readNote(){
 4         System.out.println("女仆拿到笔记本");
 5         return this.note;
 6     }
 7     public void writeNote(Note note){
 8         System.out.println("女仆写笔记");
 9         this.note = note;
10     }
11 }
复制代码

  备忘录的代码如下:

复制代码
 1 class Note{
 2     private String info;
 3     public Note(String info) {
 4         this.info = info;
 5     }
 6     public void setInfo(String info){
 7         this.info = info;
 8         System.out.println("写笔记!");
 9     }
10     public String getInfo(){
11         System.out.println("读笔记!");
12         return info;
13     }
14 }
复制代码

  全部代码:

复制代码
 1 package com.xingoo.test.design.memento;
 2 class Note{
 3     private String info;
 4     public Note(String info) {
 5         this.info = info;
 6     }
 7     public void setInfo(String info){
 8         this.info = info;
 9         System.out.println("写笔记!");
10     }
11     public String getInfo(){
12         System.out.println("读笔记!");
13         return info;
14     }
15 }
16 class Master{
17     private String info;
18     public String getInfo() {
19         return info;
20     }
21     public void setInfo(String info) {
22         this.info = info;
23     }
24     public Note createNote(String info){
25         return new Note(info);
26     }
27     public void action(Note note){
28         this.info = note.getInfo();
29         System.out.println("主人看到笔记,记起了 "+ this.info);
30     }
31     public void toDo(){
32         System.out.println("****主人正在..."+info);
33     }
34 }
35 class Maid{
36     private Note note;
37     public Note readNote(){
38         System.out.println("女仆拿到笔记本");
39         return this.note;
40     }
41     public void writeNote(Note note){
42         System.out.println("女仆写笔记");
43         this.note = note;
44     }
45 }
46 public class LifeWithMaid {
47     public static void main(String[] args) {
48         Master master = new Master();
49         Maid maid = new Maid();
50         //主人想起了要做的事情
51         maid.writeNote(master.createNote("晚上6点,配小丽看电影"));
52         //主人忙其他的事情
53         master.setInfo("睡觉吃饭打豆豆!");
54         master.toDo();//主人正在做什么?
55         //时间到了,女仆提醒主人
56         master.action(maid.readNote());
57         master.toDo();//主人正在做什么?
58     }
59 }    
复制代码

  运行结果

复制代码
女仆写笔记
****主人正在...睡觉吃饭打豆豆!
女仆拿到笔记本
读笔记!
主人看到笔记,记起了 晚上6点,配小丽看电影
****主人正在...晚上6点,配小丽看电影
复制代码

 

本文转自博客园xingoo的博客,原文链接:【设计模式】—— 备忘录模式Memento,如需转载请自行联系原博主。
相关文章
|
5月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
73 0
|
8天前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
3月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
4月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
4月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
5月前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
85 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
|
5月前
|
设计模式 存储 Go
[设计模式 Go实现] 行为型~备忘录模式
[设计模式 Go实现] 行为型~备忘录模式
|
5月前
|
设计模式 存储
【设计模式系列笔记】备忘录模式
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下捕获并恢复其内部状态。这种模式属于行为型设计模式。备忘录模式通常包含以下几个角色:发起人,备忘录,管理者。
64 0
|
5月前
|
设计模式 存储 Java
小谈设计模式(19)—备忘录模式
小谈设计模式(19)—备忘录模式