From 9e7db125a816d2f5d8d61e43170e8b21c813b6de Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sun, 17 Aug 2014 09:05:37 +0300 Subject: [PATCH] added chain of responsibility sample --- chain/pom.xml | 23 +++++++++++++ chain/src/main/java/com/iluwatar/App.java | 14 ++++++++ .../main/java/com/iluwatar/OrcCommander.java | 22 +++++++++++++ chain/src/main/java/com/iluwatar/OrcKing.java | 19 +++++++++++ .../main/java/com/iluwatar/OrcOfficer.java | 23 +++++++++++++ .../main/java/com/iluwatar/OrcSoldier.java | 22 +++++++++++++ chain/src/main/java/com/iluwatar/Request.java | 33 +++++++++++++++++++ .../java/com/iluwatar/RequestHandler.java | 23 +++++++++++++ .../main/java/com/iluwatar/RequestType.java | 9 +++++ pom.xml | 1 + 10 files changed, 189 insertions(+) create mode 100644 chain/pom.xml create mode 100644 chain/src/main/java/com/iluwatar/App.java create mode 100644 chain/src/main/java/com/iluwatar/OrcCommander.java create mode 100644 chain/src/main/java/com/iluwatar/OrcKing.java create mode 100644 chain/src/main/java/com/iluwatar/OrcOfficer.java create mode 100644 chain/src/main/java/com/iluwatar/OrcSoldier.java create mode 100644 chain/src/main/java/com/iluwatar/Request.java create mode 100644 chain/src/main/java/com/iluwatar/RequestHandler.java create mode 100644 chain/src/main/java/com/iluwatar/RequestType.java 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