设计模式--备忘录模式
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软件中的历史记录
以上是关于设计模式--备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章