diff --git a/chain/pom.xml b/chain/pom.xml
new file mode 100644
index 000000000..2bf499588
--- /dev/null
+++ b/chain/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ chain
+ 1.0-SNAPSHOT
+ chain
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/chain/src/main/java/com/iluwatar/App.java b/chain/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..33693a1d5
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,14 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ OrcKing king = new OrcKing();
+ king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle"));
+ king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner"));
+ king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax"));
+
+ }
+}
diff --git a/chain/src/main/java/com/iluwatar/OrcCommander.java b/chain/src/main/java/com/iluwatar/OrcCommander.java
new file mode 100644
index 000000000..dc0c403d0
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/OrcCommander.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class OrcCommander extends RequestHandler {
+
+ public OrcCommander(RequestHandler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void handleRequest(Request req) {
+ if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) {
+ printHandling(req);
+ } else {
+ super.handleRequest(req);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Orc commander";
+ }
+}
diff --git a/chain/src/main/java/com/iluwatar/OrcKing.java b/chain/src/main/java/com/iluwatar/OrcKing.java
new file mode 100644
index 000000000..894499878
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/OrcKing.java
@@ -0,0 +1,19 @@
+package com.iluwatar;
+
+public class OrcKing {
+
+ RequestHandler chain;
+
+ public OrcKing() {
+ buildChain();
+ }
+
+ private void buildChain() {
+ chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null)));
+ }
+
+ public void makeRequest(Request req) {
+ chain.handleRequest(req);
+ }
+
+}
diff --git a/chain/src/main/java/com/iluwatar/OrcOfficer.java b/chain/src/main/java/com/iluwatar/OrcOfficer.java
new file mode 100644
index 000000000..dfe414182
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/OrcOfficer.java
@@ -0,0 +1,23 @@
+package com.iluwatar;
+
+public class OrcOfficer extends RequestHandler {
+
+ public OrcOfficer(RequestHandler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void handleRequest(Request req) {
+ if (req.getRequestType().equals(RequestType.TORTURE_PRISONER)) {
+ printHandling(req);
+ } else {
+ super.handleRequest(req);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Orc officer";
+ }
+
+}
diff --git a/chain/src/main/java/com/iluwatar/OrcSoldier.java b/chain/src/main/java/com/iluwatar/OrcSoldier.java
new file mode 100644
index 000000000..0e5a5a603
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/OrcSoldier.java
@@ -0,0 +1,22 @@
+package com.iluwatar;
+
+public class OrcSoldier extends RequestHandler {
+
+ public OrcSoldier(RequestHandler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void handleRequest(Request req) {
+ if (req.getRequestType().equals(RequestType.COLLECT_TAX)) {
+ printHandling(req);
+ } else {
+ super.handleRequest(req);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Orc soldier";
+ }
+}
diff --git a/chain/src/main/java/com/iluwatar/Request.java b/chain/src/main/java/com/iluwatar/Request.java
new file mode 100644
index 000000000..00cd23972
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/Request.java
@@ -0,0 +1,33 @@
+package com.iluwatar;
+
+public class Request {
+
+ private String requestDescription;
+ private RequestType requestType;
+
+ public Request(RequestType requestType, String requestDescription) {
+ this.setRequestType(requestType);
+ this.setRequestDescription(requestDescription);
+ }
+
+ public String getRequestDescription() {
+ return requestDescription;
+ }
+
+ public void setRequestDescription(String requestDescription) {
+ this.requestDescription = requestDescription;
+ }
+
+ public RequestType getRequestType() {
+ return requestType;
+ }
+
+ public void setRequestType(RequestType requestType) {
+ this.requestType = requestType;
+ }
+
+ @Override
+ public String toString() {
+ return getRequestDescription();
+ }
+}
diff --git a/chain/src/main/java/com/iluwatar/RequestHandler.java b/chain/src/main/java/com/iluwatar/RequestHandler.java
new file mode 100644
index 000000000..2eb5176c0
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/RequestHandler.java
@@ -0,0 +1,23 @@
+package com.iluwatar;
+
+public abstract class RequestHandler {
+
+ private RequestHandler next;
+
+ public RequestHandler(RequestHandler next) {
+ this.next = next;
+ }
+
+ public void handleRequest(Request req) {
+ if (next != null) {
+ next.handleRequest(req);
+ }
+ }
+
+ protected void printHandling(Request req) {
+ System.out.println(this + " handling request \"" + req + "\"");
+ }
+
+ @Override
+ public abstract String toString();
+}
diff --git a/chain/src/main/java/com/iluwatar/RequestType.java b/chain/src/main/java/com/iluwatar/RequestType.java
new file mode 100644
index 000000000..9f896a54d
--- /dev/null
+++ b/chain/src/main/java/com/iluwatar/RequestType.java
@@ -0,0 +1,9 @@
+package com.iluwatar;
+
+public enum RequestType {
+
+ DEFEND_CASTLE,
+ TORTURE_PRISONER,
+ COLLECT_TAX
+
+}
diff --git a/pom.xml b/pom.xml
index ae6290b0e..7dba76b35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,7 @@
facade
flyweight
proxy
+ chain