设计模式:25、备忘录模式(标记)

目录

0、定义

1、备忘录模式的三种角色

2、备忘录模式的UML类图

3、示例代码


0、定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。

1、备忘录模式的三种角色

  • 原发者(Originator):需要在某个时刻保存其状态的对象。原发者负责创建备忘录,当原发者需要恢复某个时刻的状态时,它通过获得相应备忘录中的数据来恢复那个时刻的状态。
  • 备忘录(Memento):负责储蓄原发者状态的对象。
  • 负责人(Caretaker):负责管理保存备忘录的对象。

2、备忘录模式的UML类图

3、示例代码

备忘录

java 复制代码
package xyz.jangle.design.memento;

import java.io.Serializable;

public class Memento implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -4150939913438715041L;
	
	int state;

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}
	
}

原发者

java 复制代码
package xyz.jangle.design.memento;

public class Originator {
	
	int state;
	
	Memento createMemento() {
		Memento memento = new Memento();
		memento.setState(state);
		return memento;
	}
	
	void restoreFromMemento(Memento memento) {
		state = memento.getState();
	}
	
	void useState(){
		state++;
	}

}

负责人

java 复制代码
package xyz.jangle.design.memento;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Caretaker {
	File file;
	private Memento memento = null;
	public Caretaker() {
		super();
		this.file = new File("saveObject.txt");
	}
	
	public Memento getMemento() {
		if(!file.exists())return null;
		try {
			ObjectInputStream inObject = new ObjectInputStream(new FileInputStream("saveObject.txt"));
			memento = (Memento) inObject.readObject();
			inObject.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return memento;
	}
	
	public void saveMemento(Memento memento) {
		try {
			ObjectOutputStream outObject =  new ObjectOutputStream(new FileOutputStream("saveObject.txt"));
			outObject.writeObject(memento);
			outObject.flush();
			outObject.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

客户端(使用)

java 复制代码
package xyz.jangle.design.memento;

public class AppMain25 {

	public static void main(String[] args) {
		
		Originator originator = new Originator();
		Caretaker caretaker = new Caretaker();
		originator.useState();
		System.out.println(originator.state);	//此处是1
		caretaker.saveMemento(originator.createMemento());
		originator.useState();
		System.out.println(originator.state);	//此处是2
		originator.restoreFromMemento(caretaker.getMemento());
		System.out.println(originator.state);	//此处还原至1

	}

}

输出结果

bash 复制代码
1
2
1
相关推荐
数据知道5 小时前
Go语言设计模式:适配器模式详解
设计模式·golang·建造者模式
执笔论英雄6 小时前
【设计模式】策略类和依赖注入
设计模式
手把手入门10 小时前
23种设计模式
设计模式
qqxhb10 小时前
系统架构设计师备考第59天——SOA原则&设计模式
设计模式·系统架构·版本管理·标准化·松耦合·可复用·服务粒度
Yeniden10 小时前
【设计模式】桥接模式大白话讲解
设计模式·桥接模式
崎岖Qiu10 小时前
【设计模式笔记10】:简单工厂模式示例
java·笔记·设计模式·简单工厂模式
数据知道18 小时前
Go语言设计模式:工厂模式详解
开发语言·设计模式·golang·go语言·工厂模式
懒羊羊不懒@20 小时前
JavaSe—泛型
java·开发语言·人工智能·windows·设计模式·1024程序员节
rookie_fly1 天前
基于Vue的数字输入框指令
前端·vue.js·设计模式
Yeniden1 天前
【设计模式】# 外观模式(Facade)大白话讲解!
java·设计模式·外观模式