diff --git a/memento/pom.xml b/memento/pom.xml
new file mode 100644
index 000000000..f578a0a7f
--- /dev/null
+++ b/memento/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ memento
+ 1.0-SNAPSHOT
+ memento
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/memento/src/main/java/com/iluwatar/App.java b/memento/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..7ee027c2d
--- /dev/null
+++ b/memento/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,30 @@
+package com.iluwatar;
+
+import java.util.Stack;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ Stack states = new Stack<>();
+
+ Star star = new Star(StarType.SUN, 10000000, 500000);
+ System.out.println(star);
+ states.add(star.getMemento());
+ star.timePasses();
+ System.out.println(star);
+ states.add(star.getMemento());
+ star.timePasses();
+ System.out.println(star);
+ states.add(star.getMemento());
+ star.timePasses();
+ System.out.println(star);
+ states.add(star.getMemento());
+ star.timePasses();
+ System.out.println(star);
+ while (states.size() > 0) {
+ star.setMemento(states.pop());
+ System.out.println(star);
+ }
+ }
+}
diff --git a/memento/src/main/java/com/iluwatar/Star.java b/memento/src/main/java/com/iluwatar/Star.java
new file mode 100644
index 000000000..90c1028fd
--- /dev/null
+++ b/memento/src/main/java/com/iluwatar/Star.java
@@ -0,0 +1,63 @@
+package com.iluwatar;
+
+public class Star {
+
+ private StarType type;
+ private int ageYears;
+ private int massTons;
+
+ public Star(StarType startType, int startAge, int startMass) {
+ this.type = startType;
+ this.ageYears = startAge;
+ this.massTons = startMass;
+ }
+
+ public void timePasses() {
+ ageYears *= 2;
+ massTons *= 8;
+ switch (type) {
+ case RED_GIANT:
+ type = StarType.WHITE_DWARF;
+ break;
+ case SUN:
+ type = StarType.RED_GIANT;
+ break;
+ case SUPERNOVA:
+ type = StarType.DEAD;
+ break;
+ case WHITE_DWARF:
+ type = StarType.SUPERNOVA;
+ break;
+ case DEAD:
+ ageYears *= 2;
+ massTons = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+ StarMemento getMemento() {
+
+ StarMementoInternal state = new StarMementoInternal();
+ state.setAgeYears(ageYears);
+ state.setMassTons(massTons);
+ state.setType(type);
+ return state;
+
+ }
+
+ void setMemento(StarMemento memento) {
+
+ StarMementoInternal state = (StarMementoInternal) memento;
+ this.type = state.getType();
+ this.ageYears = state.getAgeYears();
+ this.massTons = state.getMassTons();
+
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s age: %d years mass: %d tons", type.toString(), ageYears, massTons);
+ }
+}
diff --git a/memento/src/main/java/com/iluwatar/StarMemento.java b/memento/src/main/java/com/iluwatar/StarMemento.java
new file mode 100644
index 000000000..cc7238d12
--- /dev/null
+++ b/memento/src/main/java/com/iluwatar/StarMemento.java
@@ -0,0 +1,5 @@
+package com.iluwatar;
+
+public interface StarMemento {
+
+}
diff --git a/memento/src/main/java/com/iluwatar/StarMementoInternal.java b/memento/src/main/java/com/iluwatar/StarMementoInternal.java
new file mode 100644
index 000000000..dd0e2c343
--- /dev/null
+++ b/memento/src/main/java/com/iluwatar/StarMementoInternal.java
@@ -0,0 +1,27 @@
+package com.iluwatar;
+
+public class StarMementoInternal implements StarMemento {
+
+ private StarType type;
+ private int ageYears;
+ private int massTons;
+
+ public StarType getType() {
+ return type;
+ }
+ public void setType(StarType type) {
+ this.type = type;
+ }
+ public int getAgeYears() {
+ return ageYears;
+ }
+ public void setAgeYears(int ageYears) {
+ this.ageYears = ageYears;
+ }
+ public int getMassTons() {
+ return massTons;
+ }
+ public void setMassTons(int massTons) {
+ this.massTons = massTons;
+ }
+}
diff --git a/memento/src/main/java/com/iluwatar/StarType.java b/memento/src/main/java/com/iluwatar/StarType.java
new file mode 100644
index 000000000..54b352184
--- /dev/null
+++ b/memento/src/main/java/com/iluwatar/StarType.java
@@ -0,0 +1,36 @@
+package com.iluwatar;
+
+public enum StarType {
+
+ SUN,
+ RED_GIANT,
+ WHITE_DWARF,
+ SUPERNOVA,
+ DEAD;
+
+ @Override
+ public String toString() {
+ String s = "";
+ switch (this) {
+ case RED_GIANT:
+ s = "red giant";
+ break;
+ case SUN:
+ s = "sun";
+ break;
+ case SUPERNOVA:
+ s = "supernova";
+ break;
+ case WHITE_DWARF:
+ s = "white dwarf";
+ break;
+ case DEAD:
+ s = "dead star";
+ break;
+ default:
+ break;
+ }
+ return s;
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index a717a68f1..50debda49 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,7 @@
interpreter
iterator
mediator
+ memento