设计模式之备忘录模式

简介: 备忘录模式真的是很一个比较实用的设计模式,比如说日志恢复、断点重传等等。提供的就是一种“后悔药的机制”。让我们记录下来程序运行过程中的各种状态,还能够恢复。

一、认识备忘录模式


在这里我们以在电脑上下棋为例,通过备忘录模式能够记录下来所走的每一步棋,当突然断点的时候,还能够恢复到某一步,就是这样一个功能。其实备忘录模式的思想就是这样。我们从专业的角度来对其进行一个理解。


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


对于我们用户来说,就算是保存的日志被删了,也不会影响我们正常的功能。我们把上面的例子画一个类图描述一下。

v2-dee6c5e8b8219dcaf264293cb31648ee_1440w.jpg

这个图已经很清晰了,里面主要涉及到三个角色:


(1)Originator:负责创建一个备忘录,就好比是例子中的棋盘。

(2)Mement:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento,就好比是例子中的电脑日志。

(3)Caretaker: 负责存储备忘录,就好比例子中的电脑。

整个流程逻辑我们捋一遍:电脑把棋盘中的每一步棋保存在日志中。现在三个角色的作用应该就能明白了。


二、代码实现


第一步:新建一个备忘录Step,保存棋盘的每一步棋

//备忘录类:记录棋盘下的每一步棋
public class Step {
     public int x;
     public int y;
    @Override
    public String toString() {
        return "Step [x=" + x + ", y=" + y + "]";
    }    
}

第二步:Originator新建棋盘

public class Chess {
    public int x=0;
    public int y=0;
    public void play(){
        x=x+1;
        y=y+1;
        System.out.println(String.format("x=%d,y=%d", x,y));
    }
    public void quit() {
        System.out.println("退出前棋盘状态是:"+this.toString());
    }
    public Step createStep(){
        Step step = new Step();
        step.x=x;
        step.y=y;
        return step;
    }
    public void restore(Step step){
        this.x=step.x;
        this.y=step.y;
        System.out.println("恢复到:"+this.toString());
    }
    @Override
    public String toString() {
        return "Chess [x=" + x + ", y=" + y + "]";
    }
}

第三步:Caretaker创建电脑

public class Computor {
    //棋盘会下很多步,我们使用list保存
    private ArrayList steps = new ArrayList();
    //保存每一步
    public void saveStep(Step step){
        steps.add(step);
    }
    public Step getStep(int i){
        return (Step) steps.get(i);
    }
}

第四步:模拟一下整个过程

public class Client {
    public static void main(String[] args) {
        //1、创建一个棋盘开始下棋
        Chess chess= new Chess();
        //2、开始下棋,可以有N多步
        chess.play();
        //3、下一步就把步骤保留下来
        Computor computor=new Computor();
        computor.saveStep(chess.createStep());
        //可以一直下到棋局结束
        chess.play();
        computor.saveStep(chess.createStep());
        //4、保留玩了突然断电,棋盘退出
        chess.quit();
        //5、来电重启之后,恢复到之前的状态
        Chess chess2=new Chess();
        //下标0:表示保存的第一步,以此类推
        chess2.restore(computor.getStep(0));
    }
}

我们可以看一下结果输出。v2-101ec029f43fd01a4179f2b0e78c4094_1440w.jpg

我们可以看到输出了之前的状态。这就是备忘录模式,程序运行的每一步都会记录保存下来,在数据库里面经常会用到,而且mysql数据库中的回滚机制就是使用了他的思想。


三、分析备忘录模式


优点


(1)提供了一种恢复机制可以是你回复到你保留地任何状态。

(2)对信息封装,即使保存的状态信息丢失了,也不会对程序的正常运行有影响。


缺点


每一次记录的时候都会消耗系统资源,影响系统效率。

不过备忘录模式使用的场景极其广泛,可以说每一个大型软件都会用到这种模式。


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