二十三种设计模式分类
一、概述
备忘录(Memento
)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
优点
备忘录模式是一种对象行为型模式,其主要优点如下。
- 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
- 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
- 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
缺点
资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
场景
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。
二、实现
1. 结构图
备忘录模式的主要角色如下。
- 发起人(
Originator
)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。 - 备忘录(
Memento
)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。 - 管理者(
Caretaker
)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
PS
:UML
结构图可以参考,例子实现并不根据UML
图来完成,灵活实现即可;
2. 实现
- 对象源状态
package cn.missbe.model.memento;
import java.io.Serializable;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/5/6 下午4:16
* description:
**/
public class Originator implements Serializable {
private String state;
private String info;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento saveStateToMemento(){
return new Memento(state,info);
}
public void getStateFromMemento(Memento memento){
state = memento.getState();
info = memento.getInfo();
}
@Override
public String toString() {
return "Originator{" + "state='" + state + '\'' + ", info='" + info + '\'' + '}';
}
}
- 备忘录对象
package cn.missbe.model.memento;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
*
* @author lyg 2020/5/6 下午4:16
* description:
**/
public class Memento {
private String state;
private String info;
public Memento(String state) {
this.state = state;
}
public Memento(String state, String info) {
this.state = state;
this.info = info;
}
public String getState() {
return state;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
- 主类,调用测试
package cn.missbe.model.memento;
import java.io.*;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
*
* @author lyg 2020/5/6 下午4:11
* description:
* 备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象
* 例如:游戏存档、撤销操作、恢复某个状态
**/
public class Main {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("state 1");
originator.setInfo("info 1");
System.out.println("Originator 1:" + originator);
////Method 1:save memory
Memento memento = originator.saveStateToMemento();
///Method 2:save disk
save2Disk(originator);
originator.setState("state 2");
originator.setInfo("info 2");
System.out.println("Originator 2" + originator);
////Method 1:read memory
originator.getStateFromMemento(memento);
System.out.println("Originator:" + originator);
///Method 2:read disk
Originator tmp = read2Disk();
System.out.println("Serializable:" + tmp);
}
private static void save2Disk(Originator originator) {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("originator.data")))) {
oos.writeObject(originator);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private static Originator read2Disk() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("originator.data")))) {
Object o = ois.readObject();
return (Originator) o;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}