设计模式--备忘录模式

Posted bai3535

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--备忘录模式相关的知识,希望对你有一定的参考价值。

备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

核心:就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原来的状态

角色

1)发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

2)备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

3)管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

图示技术图片

 

 

package com.offcn.designpattern.mementopattern;

public class MementopatternDemo {
    public static void main(String[] args) {
        CareTaker taker = new CareTaker();
        Emp emp = new Emp("乐乐",23,3454);
        System.out.println("第一次打印"+emp);
        taker.setEmpMemento(emp.memento());
        emp.setName("小白");
        emp.setAge(18);
        emp.setSalary(10000);
        System.out.println("第二次打印"+emp);
        emp.recovery(taker.getEmpMemento());
        System.out.println("第三次打印"+emp);
    }
}
//管理者(Caretaker)角色
class CareTaker{
    private EmpMemento empMemento;

    public EmpMemento getEmpMemento() {
        return empMemento;
    }

    public void setEmpMemento(EmpMemento empMemento) {
        this.empMemento = empMemento;
    }
}
//备忘录(Memento)角色
class EmpMemento{
    private String name;
    private int age;
    private double salary;

    public EmpMemento(Emp e){
        this.name = e.getName();
        this.age = e.getAge();
        this.salary = e.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;
    }
}
//发起人(Originator)角色
class Emp{
    private String name;
    private int age;
    private double salary;
    //进行备忘操作并返回备忘对象
    public EmpMemento memento(){
        return new EmpMemento(this);
    }
    //进行数据恢复成指定备忘录对象的值
    public void recovery(EmpMemento memento){
        this.name = memento.getName();
        this.age = memento.getAge();
        this.salary = memento.getSalary();
    }
    public Emp(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    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;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name=‘" + name +  +
                ", age=" + age +
                ", salary=" + salary +
                };
    }
}

输出:

技术图片

优点

1)提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。

2)实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。

3)简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

缺点

资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

使用场景

1)         棋类游戏中的悔棋,普通软件中的撤销操作

2)         数据库软件中事务管理的回滚操作

3)         Photoshop软件中的历史记录

 

以上是关于设计模式--备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

19-备忘录(Memento)模式Ruby实现

设计模式----备忘录模式

设计模式之备忘录模式

设计模式14:备忘录模式

设计模式之备忘录模式

设计模式之备忘录模式