Рубрики
Без рубрики

Шаблон дизайна сувениров на Java

Шаблон дизайна памятки, шаблон памятки, java-памятка, Создатель, Хранитель, пример шаблона дизайна памятки на java, программа с исходным кодом

Автор оригинала: Pankaj Kumar.

Шаблон дизайна сувениров – это один из шаблонов поведенческого дизайна. Шаблон дизайна памятки используется, когда мы хотим сохранить состояние объекта, чтобы мы могли восстановить его позже. Шаблон Memento используется для реализации этого таким образом, чтобы сохраненные данные о состоянии объекта были недоступны за пределами объекта, это защищает целостность сохраненных данных о состоянии.

Шаблон Дизайна Сувенира

Шаблон дизайна сувенира реализован с двумя объектами – Создателем и Хранителем .

Создатель-это объект, состояние которого необходимо сохранить и восстановить, и он использует внутренний класс для сохранения состояния объекта. Внутренний класс называется Memento и он является частным, поэтому к нему нельзя получить доступ из других объектов.

Хранитель-это вспомогательный класс, который отвечает за хранение и восстановление состояния отправителя с помощью объекта Memento. Поскольку Сувенир является личным для Создателя, Хранитель не может получить к нему доступ, и он хранится как объект внутри хранителя.

Шаблон Дизайна Сувенира Java

Одним из лучших примеров из реальной жизни являются текстовые редакторы, в которых мы можем сохранять данные в любое время и использовать отмену, чтобы восстановить их в предыдущее сохраненное состояние.

Мы реализуем ту же функцию и предоставим утилиту, с помощью которой мы сможем в любое время записывать и сохранять содержимое в файл и восстанавливать его до последнего сохраненного состояния. Для простоты я не буду использовать какие-либо операции ввода-вывода для записи данных в файл.

Класс Создателя шаблона на Память

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 и реализацию методов сохранения и отмены. Теперь мы можем продолжить реализацию класса Смотрителя.

Класс Смотрителя с памятным Рисунком

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);
	}
}

Обратите внимание, что объект-хранитель содержит сохраненное состояние в виде объекта, поэтому он не может изменять свои данные, а также не знает о его структуре.

Пример Тестового Класса Шаблона Памятки

Давайте напишем простую тестовую программу, которая будет использовать нашу реализацию шаблона 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");
		
	}

}

Вывод приведенного выше примера тестовой программы с памятным рисунком является:

First Set of Data



First Set of Data
Second Set of Data



First Set of Data

Шаблон Memento прост и легок в реализации, одна из вещей, о которой нужно позаботиться, – это то, что класс Memento должен быть доступен только объекту-создателю. Также в клиентском приложении мы должны использовать объект хранителя для сохранения и восстановления состояния отправителя.

Кроме того, если объект-создатель имеет свойства, которые не являются неизменяемыми, мы должны использовать глубокое копирование или клонирование, чтобы избежать проблем с целостностью данных, как я использовал в приведенном выше примере. Мы можем использовать сериализацию для достижения реализации шаблона Memento, которая является более общей, чем шаблон Memento, где каждый объект должен иметь собственную реализацию класса Memento.

Одним из недостатков является то, что если объект-создатель очень огромен, то размер объекта Memento также будет огромным и потребует много памяти.