设计模式-备忘录模式

About 2 minpattermjava memento

一、对备忘录模式的理解

备忘录就是备忘的意思,就像git一样,每个状态都记得,如果代码写错了,还可以回到历史版本。而且对现有版本不回产生影响,如果还需要回到现有版本也是可以的。可以实现撤销功能。实现的时候主要需要一个发起人、守护人、和一个备忘录类。

二、代码实现

创建备忘录类,用于存放数据

 // 备忘录
public class Memento {
	private String state;
	
	public Memento(String state) {
		this.state = state;
	}
	public String getState() {
		return this.state;
	}
}

创建发起人类、用来设置状态,获取备忘录、设置备忘录等功能。


// 发起人
public class Originator {
	private String state;
	public void setState(String state){
		this.state = state;
	}
	
	public String getState() {
		return this.state;
	}
	// 保存状态到备忘录
	public Memento saveStateToMemento(){
		return new Memento(state);
	}
	// 通过备忘录获取状态
	public void getStateFromMemento(Memento m) {
		state = m.getState();
	}
}

创建守护者类、用于存放历史备忘录、增加历史版本备忘录,通过下标获取备忘录等

// 守护者
public class CareTaker {
	private List<Memento> list = new ArrayList<Memento>();
	
	public void add(Memento m) {
		list.add(m);
	}
	public Memento getMemento(int i) {
		return list.get(i);
	}
}

main 方法实现

public static void main(String[] args) {
		Originator origin = new Originator();
		CareTaker ct = new CareTaker();
		origin.setState("状态1");
		origin.setState("状态2");
		ct.add(origin.saveStateToMemento());
		origin.setState("状态3");
		ct.add(origin.saveStateToMemento());
		origin.setState("状态4");
		
		System.out.println("当前状态为:"+ origin.getState());
		origin.getStateFromMemento(ct.getMemento(0));
		System.out.println("回到第一个状态为:"+ origin.getState());
		origin.getStateFromMemento(ct.getMemento(1));
		System.out.println("回到第二个状态为:"+ origin.getState());
		
	}

运行结果

当前状态为:状态4
回到第一个状态为:状态2
回到第二个状态为:状态3

三、UML类图

备忘录模式

四、笔记

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

备忘录的优点:

  • 将被存储的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。

  • 保持关键对象的数据封装

  • 提供了容易实现的恢复能力

备忘录的用途和缺点:

  • 备忘录用于存储状态

  • 存储和恢复状态可能比较费时间

  • java中可以考虑使用序列化机制存储系统的状态。

Last update:
Contributors: gaoqisen