. Java Design Patterns . Java Design Patterns Memento
Java Design Patterns Memento
Memento (aka Token) Overview
One object stores another objects state.
DvdDetails.java - the Originator
(the class to be backed up)
Contains the inner class DvdMemento - the Memento
import java.util.ArrayList; import java.util.ListIterator;
//the originator public class DvdDetails { private String titleName; private ArrayList stars; private char encodingRegion; public DvdDetails(String titleName, ArrayList stars, char encodingRegion) { this.setTitleName(titleName); this.setStars(stars); this.setEncodingRegion(encodingRegion); } private void setTitleName(String titleNameIn) { this.titleName = titleNameIn; } private String getTitleName() { return this.titleName; } private void setStars(ArrayList starsIn) { this.stars = starsIn; } public void addStar(String starIn) { stars.add(starIn); } private ArrayList getStars() { return this.stars; } private static String getStarsString(ArrayList starsIn) { int count = 0; StringBuffer sb = new StringBuffer(); ListIterator starsIterator = starsIn.listIterator(); while (starsIterator.hasNext()) { if (count++ > 0) {sb.append(", ");} sb.append((String) starsIterator.next()); } return sb.toString(); } private void setEncodingRegion(char encodingRegionIn) { this.encodingRegion = encodingRegionIn; } private char getEncodingRegion() { return this.encodingRegion; } public String formatDvdDetails() { return ("DVD: " + this.getTitleName() + ", starring: " + getStarsString(getStars()) + ", encoding region: " + this.getEncodingRegion()); } //sets current state to what DvdMemento has public void setDvdMemento(DvdMemento dvdMementoIn) { dvdMementoIn.getState(); } //save current state of DvdDetails in a DvdMemento public DvdMemento createDvdMemento() { DvdMemento mementoToReturn = new DvdMemento(); mementoToReturn.setState(); return mementoToReturn; } //an inner class for the memento class DvdMemento { private String mementoTitleName; private ArrayList mementoStars; private char mementoEncodingRegion; //sets DvdMementoData to DvdDetails public void setState() { //Because String are immutable we can just set // the DvdMemento Strings to = the DvdDetail Strings. mementoTitleName = getTitleName(); mementoEncodingRegion = getEncodingRegion(); //However, ArrayLists are not immutable, // so we need to instantiate a new ArrayList. mementoStars = new ArrayList(getStars()); } //resets DvdDetails to DvdMementoData public void getState() { setTitleName(mementoTitleName); setStars(mementoStars); setEncodingRegion(mementoEncodingRegion); } //only useful for testing public String showMemento() { return ("DVD: " + mementoTitleName + ", starring: " + getStarsString(mementoStars) + ", encoding region: " + mementoEncodingRegion); } } }
download source, use right-click and "Save Target As..." to save with a .java extension.
TestDvdMemento.java - testing the Memento - contains a Caretaker object
import java.util.ArrayList;
public class TestDvdMemento { public static void main(String[] args) { DvdDetails.DvdMemento dvdMementoCaretaker; //the Caretaker ArrayList stars = new ArrayList(); stars.add(new String("Guy Pearce")); DvdDetails dvdDetails = new DvdDetails("Memento", stars, '1'); dvdMementoCaretaker = dvdDetails.createDvdMemento(); System.out.println("as first instantiated"); System.out.println(dvdDetails.formatDvdDetails()); System.out.println(""); dvdDetails.addStar("edskdzkvdfb"); //oops - Cappuccino on the keyboard! System.out.println("after star added incorrectly"); System.out.println(dvdDetails.formatDvdDetails()); System.out.println(""); System.out.println("the memento"); System.out.println(dvdMementoCaretaker.showMemento()); //show the memento System.out.println(""); dvdDetails.setDvdMemento(dvdMementoCaretaker); //back off changes System.out.println( "after DvdMemento state is restored to DvdDetails"); System.out.println(dvdDetails.formatDvdDetails()); } }
download source, use right-click and "Save Target As..." to save with a .java extension.
Test Results
as first instantiated DVD: Memento, starring: Guy Pearce, encoding region: 1
after title set incorrectly DVD: Memento, starring: Guy Pearce, edskdzkvdfb, encoding region: 1
the memento DVD: Memento, starring: Guy Pearce, encoding region: 1
after DvdMemento state is restored to DvdDetails DVD: Memento, starring: Guy Pearce, encoding region: 1
UML
References
| Comments Comments are left by visitors to FluffyCat.com, are not endorsed by FluffyCat.com, and may or may not be accurate. |
| Comment by archive Rate this Comment |
I realy appreciate the Java Patterns on your site. Since I like to play with the examples I simply copied it into text fils and compiled them. I found a few minor problems you may want to know about:
|
| Sign In |
| to add your own comment |