Java实现23种设计模式(十三):备忘录模式

二十三种设计模式分类

Java实现23种设计模式(十三):备忘录模式_第1张图片
设计模式三大分类.jpg

一、概述

备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

优点

备忘录模式是一种对象行为型模式,其主要优点如下。

  • 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  • 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  • 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

缺点

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

场景

1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。


二、实现

1. 结构图

备忘录模式的主要角色如下。

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
Java实现23种设计模式(十三):备忘录模式_第2张图片
备忘录模式

PS:UML结构图可以参考,例子实现并不根据UML图来完成,灵活实现即可;

2. 实现

  • 对象源状态
package cn.missbe.model.memento;

import java.io.Serializable;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 * @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: [email protected]
 *
 * @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: [email protected]
 *
 * @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;
    }
}

你可能感兴趣的:(Java实现23种设计模式(十三):备忘录模式)