memento模式_Java中的Memento设计模式-示例教程
memento模式
記憶模式是行為設計模式之一 。 當我們要保存對象的狀態以便以后可以恢復時,可以使用Memento設計模式。 使用Memento模式以這種方式實現該目的,即無法在對象外部訪問對象的已保存狀態數據,這可以保護已保存狀態數據的完整性。
Memento模式通過兩個對象實現-Originator和Caretaker 。 發起者是需要保存和恢復其狀態的對象,并且它使用內部類來保存對象的狀態。 內部類稱為Memento及其私有類,因此無法從其他對象訪問它。
Caretaker是幫助程序類,負責通過Memento對象存儲和還原發起者的狀態。 由于Memento對發起者是私有的,因此看守者無法訪問它,并且將其作為對象存儲在看守者中。
現實生活中最好的示例之一是文本編輯器,我們可以在其中隨時保存其數據,并使用undo將其還原到以前的保存狀態。 我們將實現相同的功能,并提供一個實用程序,使我們可以隨時將內容寫入并保存到文件中,并將其恢復到上次保存的狀態。 為簡單起見,我將不使用任何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();}@Overridepublic 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 objectthis.content=new StringBuilder(content);}} }注意Memento內部類以及save和undo方法的實現。 現在,我們可以繼續實施看守類。
看守班
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 filecaretaker.save(fileWriter);//now write something elsefileWriter.write("Second Set of Data\n");//checking file contentsSystem.out.println(fileWriter+"\n\n");//lets undo to last savecaretaker.undo(fileWriter);//checking file content againSystem.out.println(fileWriter+"\n\n");}}上面程序的輸出是:
First Set of DataFirst Set of Data Second Set of DataFirst Set of Data該模式簡單且易于實現,需要注意的一件事是Memento類應僅對Originator對象可訪問。 同樣在客戶端應用程序中,我們應該使用看守對象來保存和還原發起者狀態。
同樣,如果Originator對象具有不可變的屬性,我們應該使用深層復制或克隆來避免數據完整性問題,就像我在上面的示例中使用的那樣。 我們可以使用序列化來實現更通用的memento模式實現,而不是Memento模式實現,因為每個對象都需要擁有自己的Memento類實現。
缺點之一是,如果Originator對象非常大,那么Memento對象的大小也會很大,并占用大量內存。
翻譯自: https://www.javacodegeeks.com/2013/08/memento-design-pattern-in-java-example-tutorial.html
memento模式
總結
以上是生活随笔為你收集整理的memento模式_Java中的Memento设计模式-示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击防御的区别与联系(ddos攻
- 下一篇: 阿玛尼口红备案编号(阿玛尼备案号)