行为设计模式 - Memento设计模式

 

行为设计模式 - Memento设计模式

 

Memento 设计模式是行为设计​​模式之一。当我们想要保存对象的状态以便稍后可以恢复时,使用Memento设计模式。Memento模式用于实现这一点,使得对象的保存状态数据不能在对象外部访问,这保护了已保存状态数据的完整性。

 

行为设计模式 - Memento设计模式_第1张图片

 

目录[ 隐藏 ]

  • 1纪念品设计模式

     

    • 1.1 Memento设计模式Java
    • 1.2 Memento Pattern Originator Class
    • 1.3纪念模式看守课程
    • 1.4 Memento Pattern示例测试类

纪念品设计模式

行为设计模式 - Memento设计模式_第2张图片
Memento设计模式用两个对象实现 - OriginatorCaretaker

Originator是需要保存和恢复其状态的对象,它使用内部类来保存Object的状态。内部类称为Memento,它是私有的,因此无法从其他对象访问它。

Caretaker是帮助类,负责通过Memento对象存储和恢复Originator的状态。由于Memento是Originator的私人,因此Caretaker无法访问它,并且它作为对象存储在看管人中。

 

纪念品设计模式Java

最好的现实生活示例之一是文本编辑器,我们可以随时保存它的数据,并使用撤消将其恢复到以前保存的状态。

我们将实现相同的功能并提供一个实用程序,我们可以随时编写内容并将其保存到文件中,我们可以将其恢复到上次保存的状态。为简单起见,我不会使用任何IO操作将数据写入文件。

 

纪念品模式发起者类


package com.journaldev.design.memento;

public class FileWriterUtil {

	private String fileName;
	private StringBuilder content;
	
	public FileWriterUtil(String file){
		this.fileName=file;
		this.content=new StringBuilder();
	}
	
	@Override
	public String toString(){
		return this.content.toString();
	}
	
	public void write(String str){
		content.append(str);
	}
	
	public Memento save(){
		return new Memento(this.fileName,this.content);
	}
	
	public void undoToLastSave(Object obj){
		Memento memento = (Memento) obj;
		this.fileName= memento.fileName;
		this.content=memento.content;
	}
	
	
	private class Memento{
		private String fileName;
		private StringBuilder content;
		
		public Memento(String file, StringBuilder content){
			this.fileName=file;
			//notice the deep copy so that Memento and FileWriterUtil content variables don't refer to same object
			this.content=new StringBuilder(content);
		}
	}
}

注意Memento内部类以及save和undo方法的实现。现在我们可以继续实施Caretaker课程。

 

纪念品模式看守课


package com.journaldev.design.memento;

public class FileWriterCaretaker {

	private Object obj;
	
	public void save(FileWriterUtil fileWriter){
		this.obj=fileWriter.save();
	}
	
	public void undo(FileWriterUtil fileWriter){
		fileWriter.undoToLastSave(obj);
	}
}

请注意,看守对象包含Object形式的已保存状态,因此它不能更改其数据,也不知道它的结构。

 

Memento Pattern示例测试类

让我们编写一个简单的测试程序,它将使用我们的memento模式实现。


package com.journaldev.design.memento;

public class FileWriterClient {

	public static void main(String[] args) {
		
		FileWriterCaretaker caretaker = new FileWriterCaretaker();
		
		FileWriterUtil fileWriter = new FileWriterUtil("data.txt");
		fileWriter.write("First Set of Data\n");
		System.out.println(fileWriter+"\n\n");
		
		// lets save the file
		caretaker.save(fileWriter);
		//now write something else
		fileWriter.write("Second Set of Data\n");
		
		//checking file contents
		System.out.println(fileWriter+"\n\n");

		//lets undo to last save
		caretaker.undo(fileWriter);
		
		//checking file content again
		System.out.println(fileWriter+"\n\n");
		
	}

}

上述memento模式示例测试程序的输出为:


First Set of Data

First Set of Data
Second Set of Data

First Set of Data

Memento模式简单易行,需要注意的一点是Memento类只能访问Originator对象。同样在客户端应用程序中,我们应该使用看守者对象来保存和恢复发起者状态。

此外,如果Originator对象具有不可变的属性,我们应该使用深度复制或克隆来避免数据完整性问题,就像我在上面的示例中使用的那样。我们可以使用序列化来实现更通用的memento模式实现,而不是Memento模式,其中每个对象都需要拥有自己的Memento类实现。

其中一个缺点是,如果Originator对象非常庞大,那么Memento对象的大小也会很大并且会占用大量内存。

 

转载来源:https://www.journaldev.com/1734/memento-design-pattern-java

你可能感兴趣的:(Unix&Unix-Like,设计模式,行为设计模式,设计模式)