Java设计模式

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

2020-06-10  本文已影响0人  依然慢节奏

二十三种设计模式分类

设计模式三大分类.jpg

一、概述

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

优点

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

缺点

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

场景

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


二、实现

1. 结构图

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

备忘录模式

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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读