设计模式: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
相关推荐
晨米酱11 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机17 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤17 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式