`

设计模式之备忘录模式memento

 
阅读更多
备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原先的状态
结构
  • 源发器类originator:就是我们的业务模型,它本身可能有非常多的字段(或叫做变量)。一个字段的值发生了改变,我们可以认为Originator的状态就发生了变化。Originator里面有一个IMemento类型的字段用来记录状态的变化(它相当于一个记事本,用来备忘的)
  • 备忘录类Memento:IMemento聚合与Caretaker
  • 负责人类CareTake :用来决定什么时候将IMemento(备忘录)对象中的状态还原到Originator(原发器)中
  • IMemento(备忘录类型)
  • IState(状态类型)

或者直接描述为

  • 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
  • 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
  • 管理角色:对备忘录进行管理,保存和提供备忘录。

代码

 

/**
 * 源发器类
 */
public class EmployeeOriginal {

    private String name;
    private int age;
    private double salary;

    public EmployeeOriginal(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    //进行备忘操作,并返回备忘对象
    public EmployeeMemento memento(){
        return new EmployeeMemento(this);
    }

    //进行数据恢复,恢复到指定的备忘录状态
    public void recovery(EmployeeMemento memento){
        this.name = memento.getName();
        this.age = memento.getAge();
        this.salary = memento.getSalary();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}



/**
 * 备忘录
 */
public class EmployeeMemento {
    private String name;
    private int age;
    private double salary;

    public EmployeeMemento(EmployeeOriginal original){
        this.name = original.getName();
        this.age = original.getAge();
        this.salary = original.getSalary();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

/**
 * Created by jenny on 5/16/16.
 * 负责人类:管理备忘录对象
 */
public class CareTake {

    private EmployeeMemento memento;

    public EmployeeMemento getMemento() {
        return memento;
    }

    public void setMemento(EmployeeMemento memento) {
        this.memento = memento;
    }
}
 
public class Client {

    public static void main(String[] args){
        CareTake careTake = new CareTake();
        //原始数据
        EmployeeOriginal employeeOriginal = new EmployeeOriginal("wo",12,900);
        careTake.setMemento(employeeOriginal.memento());

        System.out.println(employeeOriginal.getName());
        System.out.println(employeeOriginal.getAge());
        System.out.println(employeeOriginal.getSalary());

        //重新赋值
        employeeOriginal.setAge(20);
        employeeOriginal.setName("ni");
        employeeOriginal.setSalary(190);

        //恢复了
        employeeOriginal.recovery(careTake.getMemento());
        System.out.println(employeeOriginal.getName());
        System.out.println(employeeOriginal.getAge());
        System.out.println(employeeOriginal.getSalary());
    }
}
 
备忘录模式的优点有:
  • 当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。
  • 备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

备忘录模式的缺点:

  • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。

如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。

 

分享到:
评论

相关推荐

    设计模式之备忘录(memento)

    备忘录(Memento)模式是一种行为设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并允许该对象在以后恢复到这个状态。这种模式常用于需要保存和恢复对象状态的情景,例如撤销/重做功能、游戏存档或...

    设计模式之备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern)是软件设计模式中的一种行为模式,它的主要目的是在不破坏对象封装性的前提下,允许对象在特定时刻保存其内部状态,并能够在之后恢复到保存时的状态。这种模式广泛应用于撤销/重做功能...

    设计模式之备忘录模式(Memento)

    备忘录模式(Memento Pattern)是设计模式中的一种行为模式,主要目的是在不违反封装原则的情况下,保存一个对象的内部状态,以便在需要时能够恢复到先前的状态。这种模式通常用于实现撤销/重做功能或者在游戏中保存...

    设计模式之备忘录模式

    备忘录模式(Memento Pattern)是软件设计模式中的一种,属于行为模式。它提供了一种方式来恢复对象到之前的状态,即“撤销”操作。备忘录模式的核心思想是保存对象的内部状态,以便在需要时能恢复到这个状态,而...

    C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式

    备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到先前的状态。这种模式在需要撤销/重做功能、...

    java设计模式-备忘录模式源代码

    备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。这个模式的名字来源于我们日常生活中使用的备忘录,它记录了一些重要的信息,当需要...

    Java设计模式-备忘录

    **Java设计模式——备忘录模式详解** 备忘录模式是一种行为设计模式,它允许对象在不破坏封装性的前提下捕获并存储其内部状态,以便稍后恢复到该状态。这种模式常用于在游戏中保存进度、撤销/重做操作、以及在复杂...

    设计模式之备忘录模式的Java版本实现

    备忘录模式是一种在软件设计中广泛使用的结构型设计模式,它的主要目的是为了保存对象的状态,以便在需要的时候能够恢复到之前的状态。备忘录模式的核心思想是通过创建一个备忘录对象来存储原对象的状态,这个备忘录...

    设计模式之备忘录模式,内含可运行代码及详细解释

    备忘录模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在需要保护对象内部状态不被外部篡改的场景下。备忘录模式的核心思想是提供一种方法来捕获一个对象的内部状态,并在该对象之外保存这个状态...

    设计模式-备忘录模式(讲解及其实现代码)

    备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。备忘录模式的核心思想是封装对象的状态,将其保存到一个独立的对象(备忘录)中,而...

    设计模式_备忘录模式.zip

    备忘录模式是一种在软件工程中广泛使用的结构型设计模式,其主要目的是为了在不破坏封装性的前提下,能够安全地保存对象的状态,并在需要时恢复到先前保存的状态。这种模式通常用于那些需要记录和回滚操作的重要场景...

    设计模式-备忘录

    备忘录模式是一种常用的设计模式,它在软件工程中用于保存对象的状态,以便在需要时恢复到之前的状态。这种模式的主要目标是实现数据的安全存储,同时保持对象的封装性,避免对外部对象直接访问其内部状态。在iOS...

    设计模式 - 备忘录模式(C++实例)

    备忘录模式是一种在不破坏封装性的前提下,捕获一个对象的状态,并允许在未来的某个时刻恢复这个状态的设计模式。这种模式在很多场景下都非常有用,例如在游戏中保存进度、在编辑器中撤销/重做操作等。备忘录模式的...

    备忘录模式.rar备忘录模式.rarjava设计模式

    备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。这种模式常用于需要记录用户操作历史或者游戏进度...

    java常用设计模式-备忘录模式

    备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。该模式通常用于需要撤销操作或恢复先前状态的情况下。备忘录模式包括三个主要组件:原始对象、备忘录...

    java设计模式之备忘录模式

    备忘录模式是一种在软件设计中广泛使用的结构型设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。在Java中,备忘录模式的应用可以帮助我们处理复杂业务逻辑中的撤销与重做操作,提高...

    23种设计模式之备忘录模式

    备忘录模式是一种行为设计模式,它允许在不破坏对象封装性的前提下,保存和恢复对象的状态。在软件开发中,这种模式常用于实现撤销/重做功能或者在需要保存临时状态的情况下。以下是对备忘录模式的详细解释: 1. **...

    java设计模式-备忘录模式

    Java设计模式中的备忘录模式(Memento Pattern)是一种用于保存对象状态的模式,以便在未来某一时刻能够恢复到之前的状态。这种模式的核心在于在不违反对象封装性的前提下,捕获对象的内部状态并将其存储起来。备忘...

    设计模式例子备忘录模式

    备忘录模式是一种在软件工程领域广泛使用的设计模式,它属于行为设计模式,主要目的是为了在不破坏对象封装性的前提下,保存一个对象的内部状态,以便在需要时能够恢复到之前的状态。这个模式通常应用于撤销/重做...

Global site tag (gtag.js) - Google Analytics