设计模式: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
相关推荐
hqxstudying2 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
花好月圆春祺夏安3 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
fie88893 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
哆啦A梦的口袋呀3 小时前
《深入设计模式》模式结构汇总
设计模式
花好月圆春祺夏安3 小时前
基于odoo17的设计模式详解---单例模式
单例模式·设计模式
在未来等你6 小时前
设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
设计模式·模板方法模式·软件架构·java开发·面向对象设计·设计模式实战·java应用开发
花好月圆春祺夏安8 小时前
基于odoo17的设计模式详解---代理模式
设计模式·代理模式
Small black human20 小时前
设计模式-应用分层
设计模式
码农秋1 天前
设计模式系列(10):结构型模式 - 桥接模式(Bridge)
设计模式·桥接模式
GodKeyNet1 天前
设计模式-桥接模式
java·设计模式·桥接模式