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