设计模式: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
相关推荐
Hanson Huang8 小时前
23种设计模式-享元(Flyweight)设计模式
java·设计模式·享元模式·结构型设计模式
Aphelios38011 小时前
Java全栈面试宝典:内存模型与Spring设计模式深度解析
java·学习·spring·设计模式·云原生·面试
NorthCastle12 小时前
设计模式-结构型模式-外观模式
java·设计模式·外观模式
刀法如飞12 小时前
MVC与MVP/MVVM/DDD架构对比,不同语言实现
设计模式·架构·mvc
hweiyu0014 小时前
【Java全栈进阶架构师实战:从设计模式到SpringCloudAlibaba,打造高可用系统】
java·spring boot·分布式·spring·spring cloud·设计模式
系统工程实验室17 小时前
系统架构设计-防腐层、门面模式和适配器模式
java·设计模式·适配器模式
minaMoonGirl18 小时前
软件设计模式-第一章
设计模式
前端花园20 小时前
看完你还能记住几个设计模式?
前端·设计模式
渊渟岳20 小时前
掌握设计模式--备忘录模式
设计模式
木子庆五1 天前
Android设计模式之单例模式
单例模式·设计模式