diff --git a/pom.xml b/pom.xml
index f42bd9b06..130772858 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,6 +37,7 @@
mediator
memento
observer
+ state
diff --git a/state/pom.xml b/state/pom.xml
new file mode 100644
index 000000000..ef9a30ff6
--- /dev/null
+++ b/state/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ state
+ 1.0-SNAPSHOT
+ state
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/state/src/main/java/com/iluwatar/AngryState.java b/state/src/main/java/com/iluwatar/AngryState.java
new file mode 100644
index 000000000..0a3de44e8
--- /dev/null
+++ b/state/src/main/java/com/iluwatar/AngryState.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class AngryState implements State {
+
+ private Mammoth mammoth;
+
+ public AngryState(Mammoth mammoth) {
+ this.mammoth = mammoth;
+ }
+
+ @Override
+ public void observe() {
+ System.out.println(String.format("%s is furious!", mammoth));
+ }
+
+ @Override
+ public void onEnterState() {
+ System.out.println(String.format("%s gets angry!", mammoth));
+ }
+
+}
diff --git a/state/src/main/java/com/iluwatar/App.java b/state/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..e0096c846
--- /dev/null
+++ b/state/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ Mammoth mammoth = new Mammoth();
+ mammoth.observe();
+ mammoth.timePasses();
+ mammoth.observe();
+ mammoth.timePasses();
+ mammoth.observe();
+
+ }
+}
diff --git a/state/src/main/java/com/iluwatar/Mammoth.java b/state/src/main/java/com/iluwatar/Mammoth.java
new file mode 100644
index 000000000..6f9f28b33
--- /dev/null
+++ b/state/src/main/java/com/iluwatar/Mammoth.java
@@ -0,0 +1,32 @@
+package com.iluwatar;
+
+public class Mammoth {
+
+ private State state;
+
+ public Mammoth() {
+ state = new PeacefulState(this);
+ }
+
+ public void timePasses() {
+ if (state.getClass().equals(PeacefulState.class)) {
+ changeStateTo(new AngryState(this));
+ } else {
+ changeStateTo(new PeacefulState(this));
+ }
+ }
+
+ private void changeStateTo(State newState) {
+ this.state = newState;
+ this.state.onEnterState();
+ }
+
+ @Override
+ public String toString() {
+ return "The mammoth";
+ }
+
+ public void observe() {
+ this.state.observe();
+ }
+}
diff --git a/state/src/main/java/com/iluwatar/PeacefulState.java b/state/src/main/java/com/iluwatar/PeacefulState.java
new file mode 100644
index 000000000..6d6179a8b
--- /dev/null
+++ b/state/src/main/java/com/iluwatar/PeacefulState.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class PeacefulState implements State {
+
+ private Mammoth mammoth;
+
+ public PeacefulState(Mammoth mammoth) {
+ this.mammoth = mammoth;
+ }
+
+ @Override
+ public void observe() {
+ System.out.println(String.format("%s is calm and peaceful.", mammoth));
+ }
+
+ @Override
+ public void onEnterState() {
+ System.out.println(String.format("%s calms down.", mammoth));
+ }
+
+}
diff --git a/state/src/main/java/com/iluwatar/State.java b/state/src/main/java/com/iluwatar/State.java
new file mode 100644
index 000000000..cee5eda69
--- /dev/null
+++ b/state/src/main/java/com/iluwatar/State.java
@@ -0,0 +1,9 @@
+package com.iluwatar;
+
+public interface State {
+
+ void onEnterState();
+
+ void observe();
+
+}