From c4912b2a2b3c2fa90a3005c87b6ba6e176cafd77 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 14:54:43 +0300 Subject: [PATCH 01/24] #143 Skeleton for Message Channel EIP example --- message-channel/.gitignore | 1 + message-channel/pom.xml | 19 +++++++++++++++++++ .../com/iluwatar/message/channel/App.java | 8 ++++++++ .../com/iluwatar/message/channel/AppTest.java | 17 +++++++++++++++++ pom.xml | 1 + 5 files changed, 46 insertions(+) create mode 100644 message-channel/.gitignore create mode 100644 message-channel/pom.xml create mode 100644 message-channel/src/main/java/com/iluwatar/message/channel/App.java create mode 100644 message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java diff --git a/message-channel/.gitignore b/message-channel/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/message-channel/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/message-channel/pom.xml b/message-channel/pom.xml new file mode 100644 index 000000000..6b3b3bb94 --- /dev/null +++ b/message-channel/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.5.0 + + message-channel + + + junit + junit + test + + + diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java new file mode 100644 index 000000000..4eeddab85 --- /dev/null +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -0,0 +1,8 @@ +package com.iluwatar.message.channel; + +public class App { + + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} diff --git a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java new file mode 100644 index 000000000..05e2aa01e --- /dev/null +++ b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java @@ -0,0 +1,17 @@ +package com.iluwatar.message.channel; + +import org.junit.Test; + +/** + * + * Application test + * + */ +public class AppTest { + + @Test + public void test() { + String[] args = {}; + App.main(args); + } +} diff --git a/pom.xml b/pom.xml index 5a154164e..35f442213 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,7 @@ half-sync-half-async step-builder layers + message-channel From cd4d4203763d50fd97aa2f81ed2ec08a6f2ad273 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 15:43:44 +0300 Subject: [PATCH 02/24] #143 Added Camel dependency --- message-channel/pom.xml | 4 ++++ .../main/java/com/iluwatar/message/channel/App.java | 10 ++++++++-- .../java/com/iluwatar/message/channel/AppTest.java | 2 +- pom.xml | 6 ++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/message-channel/pom.xml b/message-channel/pom.xml index 6b3b3bb94..a8a7f4ee2 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -10,6 +10,10 @@ message-channel + + org.apache.camel + camel-core + junit junit diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index 4eeddab85..9e8c4ba85 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -1,8 +1,14 @@ package com.iluwatar.message.channel; +import org.apache.camel.CamelContext; +import org.apache.camel.impl.DefaultCamelContext; + public class App { - public static void main(String[] args) { - System.out.println("Hello World!"); + public static void main(String[] args) throws Exception { + CamelContext context = new DefaultCamelContext(); + context.start(); + Thread.sleep(10000); + context.stop(); } } diff --git a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java index 05e2aa01e..fa3af1161 100644 --- a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java +++ b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java @@ -10,7 +10,7 @@ import org.junit.Test; public class AppTest { @Test - public void test() { + public void test() throws Exception { String[] args = {}; App.main(args); } diff --git a/pom.xml b/pom.xml index 35f442213..7300c5f00 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ 3.1.0 0.7.2.201409121644 1.4 + 2.15.3 abstract-factory @@ -105,6 +106,11 @@ commons-dbcp ${commons-dbcp.version} + + org.apache.camel + camel-core + ${camel.version} + junit junit From acd7070831997a37e7cda3e19040a22ffa00b751 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 16:37:19 +0300 Subject: [PATCH 03/24] #143 Work on the example code --- message-channel/pom.xml | 4 ++++ .../java/com/iluwatar/message/channel/App.java | 15 ++++++++++++++- pom.xml | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/message-channel/pom.xml b/message-channel/pom.xml index a8a7f4ee2..ce29ac9fd 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -14,6 +14,10 @@ org.apache.camel camel-core + + org.apache.camel + camel-stream + junit junit diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index 9e8c4ba85..64201fdfb 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -1,14 +1,27 @@ package com.iluwatar.message.channel; import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; public class App { public static void main(String[] args) throws Exception { CamelContext context = new DefaultCamelContext(); + + context.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("direct:greetings").to("stream:out"); + } + }); + context.start(); - Thread.sleep(10000); + ProducerTemplate template = context.createProducerTemplate(); + template.sendBody("direct:greetings", "jou man"); + Thread.sleep(1000); context.stop(); } } diff --git a/pom.xml b/pom.xml index 7300c5f00..391ddd9c1 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,11 @@ camel-core ${camel.version} + + org.apache.camel + camel-stream + ${camel.version} + junit junit From b3574e5e23da50a21821b55ed8329a99787b4c77 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 19:07:01 +0300 Subject: [PATCH 04/24] #143 Improve example code and add class diagram --- message-channel/etc/message-channel.png | Bin 0 -> 45921 bytes message-channel/etc/message-channel.ucls | 304 ++++++++++++++++++ .../com/iluwatar/message/channel/App.java | 5 +- 3 files changed, 305 insertions(+), 4 deletions(-) create mode 100644 message-channel/etc/message-channel.png create mode 100644 message-channel/etc/message-channel.ucls diff --git a/message-channel/etc/message-channel.png b/message-channel/etc/message-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..d29490724b688cc934076455d2d17a8f860bf799 GIT binary patch literal 45921 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%0A9IqP>GyB~cl`80v>X=K?~Ox5&J|B9Um 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 literal 0 HcmV?d00001 diff --git a/message-channel/etc/message-channel.ucls b/message-channel/etc/message-channel.ucls new file mode 100644 index 000000000..27e99e539 --- /dev/null +++ b/message-channel/etc/message-channel.ucls @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index 64201fdfb..b4d7b8576 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -1,7 +1,6 @@ package com.iluwatar.message.channel; import org.apache.camel.CamelContext; -import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; @@ -19,9 +18,7 @@ public class App { }); context.start(); - ProducerTemplate template = context.createProducerTemplate(); - template.sendBody("direct:greetings", "jou man"); - Thread.sleep(1000); + context.getRoutes().stream().forEach((r) -> System.out.println(r)); context.stop(); } } From 96dc4cdddb3a9dfd90b267b29b6098344a54a527 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 19:33:11 +0300 Subject: [PATCH 05/24] #143 Commented the example --- .../com/iluwatar/message/channel/App.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index b4d7b8576..ef4f92d3e 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -4,8 +4,35 @@ import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; +/** + * + * When two applications communicate with each other using a messaging system + * they first need to establish a communication channel that will carry the + * data. Message Channels are logical addresses in the messaging system. + *

+ * The sending application doesn't necessarily know what particular application + * will end up retrieving it, but it can be assured that the application that + * retrieves the information is interested in that information. This is because + * the messaging system has different Message Channels for different types of + * information the applications want to communicate. When an application sends + * information, it doesn't randomly add the information to any channel available; + * it adds it to a channel whose specific purpose is to communicate that sort of + * information. Likewise, an application that wants to receive particular information + * doesn't pull info off some random channel; it selects what channel to get information + * from based on what type of information it wants. + *

+ * In this example we use Apache Camel to establish a direct synchronous Message Channel + * that delivers messages to console output. No actual messages are sent, only the established + * routes are printed to standard output. + * + */ public class App { - + + /** + * Program entry point + * @param args command line args + * @throws Exception + */ public static void main(String[] args) throws Exception { CamelContext context = new DefaultCamelContext(); From 6b94390f76060a9b8221dea2a7585348725ec73c Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sat, 22 Aug 2015 19:43:21 +0300 Subject: [PATCH 06/24] #143 Added pattern description to index.md --- message-channel/index.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 message-channel/index.md diff --git a/message-channel/index.md b/message-channel/index.md new file mode 100644 index 000000000..80a068de5 --- /dev/null +++ b/message-channel/index.md @@ -0,0 +1,17 @@ +--- +layout: pattern +title: Message Channel +folder: message-channel +permalink: /patterns/message-channel/ +categories: Integration +tags: Java +--- + +**Intent:** When two applications communicate using a messaging system they do it by using logical addresses +of the system, so called Message Channels. + +![alt text](./etc/message-channel.png "Message Channel") + +**Applicability:** Use the Message Channel pattern when + +* two or more applications need to communicate using a messaging system From c745baac86f585b9a4c22cf1f888312d92cace6c Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Thu, 27 Aug 2015 19:55:12 +0300 Subject: [PATCH 07/24] #143 Nicer layout for the class diagram --- message-channel/.gitignore | 1 + message-channel/etc/message-channel.png | Bin 45921 -> 47216 bytes message-channel/etc/message-channel.ucls | 220 ++++++++++++----------- 3 files changed, 119 insertions(+), 102 deletions(-) diff --git a/message-channel/.gitignore b/message-channel/.gitignore index b83d22266..1dd333108 100644 --- a/message-channel/.gitignore +++ b/message-channel/.gitignore @@ -1 +1,2 @@ /target/ +/target/ diff --git a/message-channel/etc/message-channel.png b/message-channel/etc/message-channel.png index d29490724b688cc934076455d2d17a8f860bf799..7db473281affe66670f2a7e7488ad26de87107e2 100644 GIT binary patch literal 47216 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 literal 45921 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%0A9IqP>GyB~cl`80v>X=K?~Ox5&J|B9Um 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 diff --git a/message-channel/etc/message-channel.ucls b/message-channel/etc/message-channel.ucls index 27e99e539..3ef0ed4bc 100644 --- a/message-channel/etc/message-channel.ucls +++ b/message-channel/etc/message-channel.ucls @@ -4,7 +4,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -54,7 +54,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -74,7 +74,7 @@ - + @@ -84,7 +84,7 @@ - + @@ -94,7 +94,7 @@ - + @@ -104,7 +104,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -124,7 +124,7 @@ - + @@ -134,7 +134,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -154,7 +154,7 @@ - + @@ -164,137 +164,153 @@ - + - - + + + + + + + + + + + + + - - + + + + + + - - - - + + + + + + + + - + - + - - + + + + + + - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + - - - - - - - - - - - - - - - - + + + - - - - - - - - - - + + + - - - - - + - - - - - - - - - - - - - + - - - - - - + + + - + - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2fc778a98cdd2896402c008ac9c130db999eb431 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Thu, 27 Aug 2015 20:59:47 +0300 Subject: [PATCH 08/24] #143 Fixed duplicate line in .gitignore --- message-channel/.gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/message-channel/.gitignore b/message-channel/.gitignore index 1dd333108..b83d22266 100644 --- a/message-channel/.gitignore +++ b/message-channel/.gitignore @@ -1,2 +1 @@ /target/ -/target/ From e5ef5dbfb6aabbecee521037ac9f00ecaed143cc Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Thu, 27 Aug 2015 21:14:48 +0300 Subject: [PATCH 09/24] #143 Fix intendation in pom.xml --- message-channel/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/message-channel/pom.xml b/message-channel/pom.xml index ce29ac9fd..98add90ee 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -14,10 +14,10 @@ org.apache.camel camel-core - - org.apache.camel - camel-stream - + + org.apache.camel + camel-stream + junit junit From cd32e385e2465e8b9f36d82974b9b8ea756e952e Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Sun, 30 Aug 2015 15:22:37 +0300 Subject: [PATCH 10/24] Added second MVC example. This time the view is registered as observer to the model and gets update notifications that way. --- .../view/controller/with/observer/App.java | 29 +++++++++ .../controller/with/observer/Fatigue.java | 22 +++++++ .../with/observer/GiantController.java | 46 ++++++++++++++ .../controller/with/observer/GiantModel.java | 63 +++++++++++++++++++ .../with/observer/GiantModelObserver.java | 12 ++++ .../controller/with/observer/GiantView.java | 18 ++++++ .../view/controller/with/observer/Health.java | 22 +++++++ .../controller/with/observer/Nourishment.java | 22 +++++++ .../controller/with/observer/AppTest.java | 19 ++++++ 9 files changed, 253 insertions(+) create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/App.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Fatigue.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantController.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModel.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModelObserver.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantView.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Health.java create mode 100644 model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Nourishment.java create mode 100644 model-view-controller/src/test/java/com/iluwatar/model/view/controller/with/observer/AppTest.java diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/App.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/App.java new file mode 100644 index 000000000..0b74f4b5a --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/App.java @@ -0,0 +1,29 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * In this second example the model-view relationship is different. This time we use the Observer pattern to notify + * the {@link GiantView} each time the {@link GiantModel} is changed. This way the {@link GiantController} responsibilities + * are narrowed and it only needs to modify the {@link GiantModel} according to the user input. + * + */ +public class App { + + /** + * Program entry point + * @param args command line args + */ + public static void main( String[] args ) { + // create model, view and controller + GiantModel giant = new GiantModel(Health.HEALTHY, Fatigue.ALERT, Nourishment.SATURATED); + GiantView view = new GiantView(); + GiantController controller = new GiantController(giant, view); + // initial display + controller.updateView(); + // controller receives some interactions that affect the giant + // model modifications trigger the view rendering automatically + controller.setHealth(Health.WOUNDED); + controller.setNourishment(Nourishment.HUNGRY); + controller.setFatigue(Fatigue.TIRED); + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Fatigue.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Fatigue.java new file mode 100644 index 000000000..301a579fb --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Fatigue.java @@ -0,0 +1,22 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * Fatigue enumeration + * + */ +public enum Fatigue { + + ALERT("alert"), TIRED("tired"), SLEEPING("sleeping"); + + private String title; + + Fatigue(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantController.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantController.java new file mode 100644 index 000000000..e892b2946 --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantController.java @@ -0,0 +1,46 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * GiantController updates the giant model. + * + */ +public class GiantController { + + private GiantModel giant; + private GiantView view; + + public GiantController(GiantModel giant, GiantView view) { + this.giant = giant; + this.view = view; + this.giant.registerObserver(this.view); + } + + public Health getHealth() { + return giant.getHealth(); + } + + public void setHealth(Health health) { + this.giant.setHealth(health); + } + + public Fatigue getFatigue() { + return giant.getFatigue(); + } + + public void setFatigue(Fatigue fatigue) { + this.giant.setFatigue(fatigue); + } + + public Nourishment getNourishment() { + return giant.getNourishment(); + } + + public void setNourishment(Nourishment nourishment) { + this.giant.setNourishment(nourishment); + } + + public void updateView() { + this.view.displayGiant(giant); + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModel.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModel.java new file mode 100644 index 000000000..84b32a50a --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModel.java @@ -0,0 +1,63 @@ +package com.iluwatar.model.view.controller.with.observer; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * GiantModel contains the giant data. + * + */ +public class GiantModel { + + private Health health; + private Fatigue fatigue; + private Nourishment nourishment; + private List observers = new ArrayList<>(); + + GiantModel(Health health, Fatigue fatigue, Nourishment nourishment) { + this.health = health; + this.fatigue = fatigue; + this.nourishment = nourishment; + } + + public Health getHealth() { + return health; + } + + public void setHealth(Health health) { + this.health = health; + notifyObservers(); + } + + public Fatigue getFatigue() { + return fatigue; + } + + public void setFatigue(Fatigue fatigue) { + this.fatigue = fatigue; + notifyObservers(); + } + + public Nourishment getNourishment() { + return nourishment; + } + + public void setNourishment(Nourishment nourishment) { + this.nourishment = nourishment; + notifyObservers(); + } + + @Override + public String toString() { + return String.format("The giant looks %s, %s and %s.", health, fatigue, nourishment); + } + + public void registerObserver(GiantModelObserver observer) { + observers.add(observer); + } + + private void notifyObservers() { + observers.stream().forEach((GiantModelObserver o) -> o.modelChanged(this)); + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModelObserver.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModelObserver.java new file mode 100644 index 000000000..6363ef4f7 --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantModelObserver.java @@ -0,0 +1,12 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * GiantModelObserver is the interface for delivering update notifications. + * + */ +public interface GiantModelObserver { + + void modelChanged(GiantModel model); + +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantView.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantView.java new file mode 100644 index 000000000..f4cebad80 --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/GiantView.java @@ -0,0 +1,18 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * GiantView displays the giant + * + */ +public class GiantView implements GiantModelObserver { + + public void displayGiant(GiantModel giant) { + System.out.println(giant); + } + + @Override + public void modelChanged(GiantModel model) { + displayGiant(model); + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Health.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Health.java new file mode 100644 index 000000000..e4b8ed9a7 --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Health.java @@ -0,0 +1,22 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * Health enumeration + * + */ +public enum Health { + + HEALTHY("healthy"), WOUNDED("wounded"), DEAD("dead"); + + private String title; + + Health(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } +} diff --git a/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Nourishment.java b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Nourishment.java new file mode 100644 index 000000000..c1a8253c3 --- /dev/null +++ b/model-view-controller/src/main/java/com/iluwatar/model/view/controller/with/observer/Nourishment.java @@ -0,0 +1,22 @@ +package com.iluwatar.model.view.controller.with.observer; + +/** + * + * Nourishment enumeration + * + */ +public enum Nourishment { + + SATURATED("saturated"), HUNGRY("hungry"), STARVING("starving"); + + private String title; + + Nourishment(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } +} diff --git a/model-view-controller/src/test/java/com/iluwatar/model/view/controller/with/observer/AppTest.java b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/with/observer/AppTest.java new file mode 100644 index 000000000..9a43ce7bc --- /dev/null +++ b/model-view-controller/src/test/java/com/iluwatar/model/view/controller/with/observer/AppTest.java @@ -0,0 +1,19 @@ +package com.iluwatar.model.view.controller.with.observer; + +import org.junit.Test; + +import com.iluwatar.model.view.controller.with.observer.App; + +/** + * + * Application test + * + */ +public class AppTest { + + @Test + public void test() { + String[] args = {}; + App.main(args); + } +} From 8cc72b15a48a748282ed4939efae29a68e057c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 30 Aug 2015 15:53:33 +0300 Subject: [PATCH 11/24] #228 Moved developer information to project wiki --- README.md | 96 ------------------------------------------------------- 1 file changed, 96 deletions(-) diff --git a/README.md b/README.md index 4724ea332..919671290 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,11 @@ -#### Browse and view all of the patterns on our Website: [iluwatar.github.io/java-design-patterns/](https://iluwatar.github.io/java-design-patterns/) - # Table of Contents - Introduction - Frequently Asked Questions - - How to contribute - - Versioning - Credits - License @@ -97,98 +93,6 @@ blocked waiting for available object from the pool. This is not the case with Flyweight. - -# How to contribute [↑](#top) - -**To work on a new pattern** you need to do the following steps: - -1. If there is no issue for the new pattern yet, raise new issue. Comment on - the issue that you are working on it so that others don't start work on the - same thing. -2. Fork the repository. -3. Create a new folder for the pattern. The rough structure of the new folder would be as follows: - * etc (every resource related to the pattern, like diagrams) - * src (the source code of the pattern) - * index.md (the description of the pattern) - * pom.xml (the maven pom.xml) -4. Implement the code changes in your fork. Remember to add sufficient comments - documenting the implementation. Reference the issue id e.g. #52 in your - commit messages. -5. Format the code according to [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html) - * [Eclipse configuration](https://github.com/google/styleguide/blob/gh-pages/eclipse-java-google-style.xml) - * [IntelliJ configuration](https://github.com/google/styleguide/blob/gh-pages/intellij-java-google-style.xml) -6. Create a simple class diagram from your example code and put it inside of the etc folder. -7. Add description of the pattern in index.md and link to the class diagram. - (Attention, all internal links must be relative to the pattern subdirectory, else the links dont link properly on the website) -8. Create a pull request. - -**Structure of the index.md file** - -```markdown ---- # this is so called 'Yaml Front Matter', read up on it here: http://jekyllrb.com/docs/frontmatter/ -layout: pattern # layout must allways be pattern -title: Best Pattern Ever # the properly formatted title -folder: best-pattern-ever # the folder name in which this pattern lies -permalink: /patterns/best-pattern-ever/ # the permalink to the pattern, to keep this uniform please stick to /patterns/FOLDER/ - -# both categories and tags are Yaml Lists -# you can either just pick one or write a list with '-'s -# usable categories and tags are listed here: https://github.com/iluwatar/java-design-patterns/blob/gh-pages/_config.yml -categories: creational # categories of the pattern -tags: # tags of the pattern - - best - - ever - - awesome ---- - -**Intent:** Makes your code awesome - -![alt text](./etc/best_pattern.png "Best Pattern Ever") - -**Applicability:** Use the Best Pattern Ever pattern when - -* you want to be the best -* you need to ... - -**Real world examples:** - -* [Nowhere](http://no.where.com) -``` - -**To add a new category or tag** you need to edit the _config.yml file of the gh-pages branch. -In there you should find 2 yaml lists with the respective names 'category-list' and 'tag-list' - -**To work on one of the non-pattern issues** you need to do the following steps: - -1. Check that the issue has "help wanted" badge -2. Comment on the issue that you are working on it -3. Fork the repository. -4. Implement the code changes in your fork. Remember to add sufficient comments - documenting the implementation. Reference the issue id e.g. #52 in your - commit messages. -5. Create a pull request. - -**For creating/editing UML diagrams** you need [ObjectAid UML Explorer for Eclipse](http://www.objectaid.com/home). - -**For inspiration** check out the following sources: - -* there is a good list of design patterns at [Wikipedia](http://en.wikipedia.org/wiki/Software_design_pattern) -* Martin Fowler's [Catalog of Patterns of Enterprise Application Architecture](http://martinfowler.com/eaaCatalog/) -* [pattern language for microservices](http://microservices.io/patterns/index.html) -* Microsoft's [Cloud Design Patterns](http://download.microsoft.com/download/B/B/6/BB69622C-AB5D-4D5F-9A12-B81B952C1169/CloudDesignPatternsBook-PDF.pdf) - -**Links to patterns applied in real world applications** are welcome. The links -should be added to the corresponding section of the `index.md`. - - -# Versioning [↑](#top) - -Java-design-patterns project uses [semantic versioning](http://semver.org/) -scheme. However, version numbers in this project do not signify binary releases -(since we don't make any) but rather milestones achieved on the roadmap. In -other words, version numbers are used only for project planning sake. - - # Credits [↑](#top) * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) From cc0b93dc508ebfa6bfc3e41561c506f719d81029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 30 Aug 2015 15:55:29 +0300 Subject: [PATCH 12/24] #228 Fixed "Introduction" header --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 919671290..b3bad5138 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - License -## Introduction +# Introduction [↑](#top) Design patterns are formalized best practices that the programmer can use to solve common problems when designing an application or system. From 981c0bdcd80a78cc8d77fd4947deff33cddfc01e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 30 Aug 2015 16:00:06 +0300 Subject: [PATCH 13/24] #228 Added link to developer wiki --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index b3bad5138..1b79013bf 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ # Table of Contents - Introduction + - How to contribute - Frequently Asked Questions - Credits - License @@ -34,6 +35,11 @@ problems, and it also improves code readability for coders and architects who are familiar with the patterns. +# How to contribute [↑](#top) + +If you are willing to contribute to the project you will find the relevant information in our [developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). + + # Frequently asked questions [↑](#top) **Q: What is the difference between State and Strategy patterns?** From 374d4617d599e7a6cb1fec9e674ac35f23f7e7d8 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Mon, 31 Aug 2015 23:03:00 +0300 Subject: [PATCH 14/24] Set project version to 1.6.0. --- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- dao/pom.xml | 2 +- decorator/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- execute-around/pom.xml | 2 +- facade/pom.xml | 2 +- factory-method/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- multiton/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- visitor/pom.xml | 2 +- 61 files changed, 64 insertions(+), 64 deletions(-) diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 798093c01..ddb7e7b9d 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 8def28655..74a58de92 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 adapter diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 699258d93..2a5010b74 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 async-method-invocation diff --git a/bridge/pom.xml b/bridge/pom.xml index 01bd26061..947fa2c60 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 bridge diff --git a/builder/pom.xml b/builder/pom.xml index c5405d0c6..65997c9e6 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 2a7e77e3c..482d59fab 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 business-delegate diff --git a/callback/pom.xml b/callback/pom.xml index d54b76172..f8cf6babf 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 callback diff --git a/chain/pom.xml b/chain/pom.xml index f4a712260..ebae620d6 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 chain diff --git a/command/pom.xml b/command/pom.xml index 10bc00f0c..401acba32 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 command diff --git a/composite/pom.xml b/composite/pom.xml index 4c910e451..ca4daaaad 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 composite diff --git a/dao/pom.xml b/dao/pom.xml index 6653741e4..a7a5c74ca 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 dao diff --git a/decorator/pom.xml b/decorator/pom.xml index 1b93a171c..57946b711 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 decorator diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 70300b617..a6780cb20 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index 21eb281c6..46d4a70f0 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -3,7 +3,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 0d7462486..5f16635f6 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 double-dispatch diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 90f488729..1c9a3b626 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -4,7 +4,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 event-aggregator diff --git a/execute-around/pom.xml b/execute-around/pom.xml index d8d41f5d8..7d806337b 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 execute-around diff --git a/facade/pom.xml b/facade/pom.xml index 53ac6fd67..17d3d707c 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 facade diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 1812b006d..81072a4f9 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 factory-method diff --git a/flux/pom.xml b/flux/pom.xml index 367598fa2..3efccbfa4 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 87903217c..54ca5bef2 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index d0fcc001f..a554186f3 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 front-controller diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index edbc2e420..94c12d797 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 half-sync-half-async diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index b4b5db5ae..35ebd9f59 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index f2778e0cd..8583464d3 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index b77939c9d..da5040dce 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 iterator diff --git a/layers/pom.xml b/layers/pom.xml index dd036e74c..de672a3df 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index cbbafae14..b795abf87 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 lazy-loading diff --git a/mediator/pom.xml b/mediator/pom.xml index 2f3f83ff5..5a9c00042 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 mediator diff --git a/memento/pom.xml b/memento/pom.xml index ccc2bd1e2..182a46204 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 memento diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 3a9167f5e..7162c71d9 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 5277e57ab..41a2d2013 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 model-view-presenter model-view-presenter diff --git a/multiton/pom.xml b/multiton/pom.xml index 8f1220119..6ea1ad2fa 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 multiton diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 620efa9d7..cadf6d82e 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.5.0 + 1.6.0 naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index b0146e84e..33cd798f7 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.5.0 + 1.6.0 naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index f479896cc..1fd518bb1 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.5.0 + 1.6.0 naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 8860815af..8cac48a09 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.5.0 + 1.6.0 naked-objects @@ -350,17 +350,17 @@ ${project.groupId} naked-objects-dom - 1.5.0 + 1.6.0 ${project.groupId} naked-objects-fixture - 1.5.0 + 1.6.0 ${project.groupId} naked-objects-webapp - 1.5.0 + 1.6.0 diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 9873589c7..3e018995a 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.5.0 + 1.6.0 naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index dfa1c6891..eec32fd4d 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 null-object diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 3226bf71c..4a3b237c6 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 object-pool diff --git a/observer/pom.xml b/observer/pom.xml index 49a484edf..19e93421c 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 observer diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index c3a5e46c1..2a0653981 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 poison-pill diff --git a/pom.xml b/pom.xml index 5a154164e..961d9b281 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 pom diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 6e6817621..70a716062 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 private-class-data diff --git a/property/pom.xml b/property/pom.xml index 6b0511fe0..5435f06f5 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 property diff --git a/prototype/pom.xml b/prototype/pom.xml index 39d8b7d33..0ebba706e 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 560c456b8..1f625d736 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 proxy diff --git a/repository/pom.xml b/repository/pom.xml index fe3ca4c0d..db0a8af5f 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index fb965ca2d..c8382ceb8 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 resource-acquisition-is-initialization diff --git a/servant/pom.xml b/servant/pom.xml index b59a470f2..b6497215f 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 96e4e6dbf..8e0ea8322 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 6b287242e..a596e4b0c 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index dfb5cff82..cdd9b613a 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 singleton diff --git a/specification/pom.xml b/specification/pom.xml index 53e92fef1..b4d6efe90 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 specification diff --git a/state/pom.xml b/state/pom.xml index e9178d0ae..0119146b3 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index 8466266a7..f9c98474b 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -6,7 +6,7 @@ java-design-patterns com.iluwatar - 1.5.0 + 1.6.0 step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index c24ccf9af..9532a8079 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index b0063c79e..53a7dc56e 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 21f0bad3d..42e54de7e 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 thread-pool diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index fb28424d4..7e852d4ee 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 tolerant-reader diff --git a/visitor/pom.xml b/visitor/pom.xml index a420b3269..8adda4855 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -5,7 +5,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 visitor From 60de01508a5e65532d930320262b7e1bf1c34b6f Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Mon, 31 Aug 2015 23:13:35 +0300 Subject: [PATCH 15/24] Corrected folder structure for Chain of responsibility. --- {chain-of-responsibility => chain}/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename {chain-of-responsibility => chain}/index.md (92%) diff --git a/chain-of-responsibility/index.md b/chain/index.md similarity index 92% rename from chain-of-responsibility/index.md rename to chain/index.md index cf56fe3c6..e1d2791ef 100644 --- a/chain-of-responsibility/index.md +++ b/chain/index.md @@ -1,8 +1,8 @@ --- layout: pattern title: Chain of responsibility -folder: chain-of-responsibility -permalink: /patterns/chain-of-responsibility/ +folder: chain +permalink: /patterns/chain/ categories: Behavioral tags: Java --- From 42eeb50badfbadebbb082289c62c364589fb69d0 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Mon, 31 Aug 2015 23:18:55 +0300 Subject: [PATCH 16/24] Fixed class diagram path. --- chain/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/index.md b/chain/index.md index e1d2791ef..25e14bf06 100644 --- a/chain/index.md +++ b/chain/index.md @@ -11,7 +11,7 @@ tags: Java more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. -![alt text](./chain/etc/chain_1.png "Chain of Responsibility") +![alt text](./etc/chain_1.png "Chain of Responsibility") **Applicability:** Use Chain of Responsibility when From 4135179040ba9c06b347802d51d75952284dfae7 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Wed, 2 Sep 2015 15:17:06 +0530 Subject: [PATCH 17/24] Updated build badge to redirect to Travis on click This allows for quick review of last build. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b79013bf..1e0a77c04 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Build status](https://travis-ci.org/iluwatar/java-design-patterns.svg?branch=master) [![Coverage Status](https://coveralls.io/repos/iluwatar/java-design-patterns/badge.svg?branch=master)](https://coveralls.io/r/iluwatar/java-design-patterns?branch=master) +[![Build status](https://travis-ci.org/iluwatar/java-design-patterns.svg?branch=master)](https://travis-ci.org/iluwatar/java-design-patterns) [![Coverage Status](https://coveralls.io/repos/iluwatar/java-design-patterns/badge.svg?branch=master)](https://coveralls.io/r/iluwatar/java-design-patterns?branch=master) Coverity Scan Build Status From b99d2b76de87ca82e3cacdfb487df047f27b69d2 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Wed, 2 Sep 2015 21:23:08 +0300 Subject: [PATCH 18/24] #143 Improved example documentation --- .../src/main/java/com/iluwatar/message/channel/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index ef4f92d3e..bf86fe3f9 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -8,7 +8,7 @@ import org.apache.camel.impl.DefaultCamelContext; * * When two applications communicate with each other using a messaging system * they first need to establish a communication channel that will carry the - * data. Message Channels are logical addresses in the messaging system. + * data. Message Channel decouples Message producers and consumers. *

* The sending application doesn't necessarily know what particular application * will end up retrieving it, but it can be assured that the application that From f74c8c27d1afdcacfac71318f9efd8337a129bca Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Wed, 2 Sep 2015 21:42:32 +0300 Subject: [PATCH 19/24] #143 Added second message channel. --- .../src/main/java/com/iluwatar/message/channel/App.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/message-channel/src/main/java/com/iluwatar/message/channel/App.java b/message-channel/src/main/java/com/iluwatar/message/channel/App.java index bf86fe3f9..f9a334a8a 100644 --- a/message-channel/src/main/java/com/iluwatar/message/channel/App.java +++ b/message-channel/src/main/java/com/iluwatar/message/channel/App.java @@ -21,9 +21,10 @@ import org.apache.camel.impl.DefaultCamelContext; * doesn't pull info off some random channel; it selects what channel to get information * from based on what type of information it wants. *

- * In this example we use Apache Camel to establish a direct synchronous Message Channel - * that delivers messages to console output. No actual messages are sent, only the established - * routes are printed to standard output. + * In this example we use Apache Camel to establish two different Message Channels. The first + * one reads from standard input and delivers messages to Direct endpoint. The second Message + * Channel is established from the Direct component to console output. No actual messages are sent, + * only the established routes are printed to standard output. * */ public class App { @@ -40,6 +41,7 @@ public class App { @Override public void configure() throws Exception { + from("stream:in").to("direct:greetings"); from("direct:greetings").to("stream:out"); } }); From 4fc4409d7def94b6526ddfe51395f7c97e696634 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Wed, 2 Sep 2015 21:51:14 +0300 Subject: [PATCH 20/24] #143 Added real world example --- message-channel/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/message-channel/index.md b/message-channel/index.md index 80a068de5..b5fb1761a 100644 --- a/message-channel/index.md +++ b/message-channel/index.md @@ -15,3 +15,7 @@ of the system, so called Message Channels. **Applicability:** Use the Message Channel pattern when * two or more applications need to communicate using a messaging system + +**Real world examples:** + +* [akka-camel](http://doc.akka.io/docs/akka/snapshot/scala/camel.html) From b5d03b6727ff351f6c142e571eafb91c1e7d4de3 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Wed, 2 Sep 2015 22:13:17 +0300 Subject: [PATCH 21/24] #143 Fixed version number --- message-channel/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message-channel/pom.xml b/message-channel/pom.xml index 98add90ee..ef66f2401 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -6,7 +6,7 @@ com.iluwatar java-design-patterns - 1.5.0 + 1.6.0 message-channel From 782c0b8320506dc5e65086356940fe64464dc3ea Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Thu, 3 Sep 2015 18:17:07 +0530 Subject: [PATCH 22/24] Work on #226, moved pattern specific credits to respective pattern pages in website --- README.md | 10 ---------- event-aggregator/index.md | 4 ++++ flux/index.md | 4 ++++ half-sync-half-async/index.md | 4 ++++ intercepting-filter/index.md | 4 ++++ model-view-controller/index.md | 4 ++++ naked-objects/index.md | 4 ++++ service-layer/index.md | 4 ++++ specification/index.md | 4 ++++ step-builder/index.md | 4 ++++ tolerant-reader/index.md | 4 ++++ 11 files changed, 40 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1e0a77c04..4715c3b9b 100644 --- a/README.md +++ b/README.md @@ -106,21 +106,11 @@ Flyweight. * [Java Generics and Collections](http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756/) * [Let's Modify the Objects-First Approach into Design-Patterns-First](http://edu.pecinovsky.cz/papers/2006_ITiCSE_Design_Patterns_First.pdf) * [Pattern Languages of Program Design](http://www.amazon.com/Pattern-Languages-Program-Design-Coplien/dp/0201607344/ref=sr_1_1) -* [Martin Fowler - Event Aggregator](http://martinfowler.com/eaaDev/EventAggregator.html) -* [TutorialsPoint - Intercepting Filter](http://www.tutorialspoint.com/design_pattern/intercepting_filter_pattern.htm) * [Presentation Tier Patterns](http://www.javagyan.com/tutorials/corej2eepatterns/presentation-tier-patterns) * [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](http://www.amazon.com/Functional-Programming-Java-Harnessing-Expressions/dp/1937785467/ref=sr_1_1) -* [Martin Fowler - Service Layer](http://martinfowler.com/eaaCatalog/serviceLayer.html) -* [Martin Fowler - Specifications](http://martinfowler.com/apsupp/spec.pdf) -* [Martin Fowler - Tolerant Reader](http://martinfowler.com/bliki/TolerantReader.html) -* [Trygve Reenskaug - Model-view-controller](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) -* [Flux - Application architecture for building user interfaces](http://facebook.github.io/flux/) -* [Richard Pawson - Naked Objects](http://downloads.nakedobjects.net/resources/Pawson%20thesis.pdf) * [Patterns of Enterprise Application Architecture](http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420) * [Spring Data](http://www.amazon.com/Spring-Data-Mark-Pollack/dp/1449323952/ref=sr_1_1) * [J2EE Design Patterns](http://www.amazon.com/J2EE-Design-Patterns-William-Crawford/dp/0596004273/ref=sr_1_2) -* [Marco Castigliego - Step Builder](http://rdafbn.blogspot.co.uk/2012/07/step-builder-pattern_28.html) -* [Douglas C. Schmidt and Charles D. Cranor - Half Sync/Half Async](http://www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf) * [Pattern Oriented Software Architecture Vol I-V](http://www.amazon.com/Pattern-Oriented-Software-Architecture-Volume-Patterns/dp/0471958697) diff --git a/event-aggregator/index.md b/event-aggregator/index.md index fd42e9811..1c89c7188 100644 --- a/event-aggregator/index.md +++ b/event-aggregator/index.md @@ -23,3 +23,7 @@ allowing clients to register with just the aggregator. with them all, you can centralize the registration logic to the Event Aggregator. As well as simplifying registration, a Event Aggregator also simplifies the memory management issues in using observers. + +**Credits:** + +* [Martin Fowler - Event Aggregator](http://martinfowler.com/eaaDev/EventAggregator.html) diff --git a/flux/index.md b/flux/index.md index c96b2b56a..227237168 100644 --- a/flux/index.md +++ b/flux/index.md @@ -17,3 +17,7 @@ logic, which updates all of the views that are affected. **Applicability:** Use the Flux pattern when * you want to focus on creating explicit and understandable update paths for your application's data, which makes tracing changes during development simpler and makes bugs easier to track down and fix. + +**Credits:** + +* [Flux - Application architecture for building user interfaces](http://facebook.github.io/flux/) diff --git a/half-sync-half-async/index.md b/half-sync-half-async/index.md index afeb20037..0ea0254b8 100644 --- a/half-sync-half-async/index.md +++ b/half-sync-half-async/index.md @@ -26,3 +26,7 @@ degrading execution efficiency. * [BSD Unix networking subsystem](http://www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf) * [Real Time CORBA](http://www.omg.org/news/meetings/workshops/presentations/realtime2001/4-3_Pyarali_thread-pool.pdf) * [Android AsyncTask framework](http://developer.android.com/reference/android/os/AsyncTask.html) + +**Credits:** + +* [Douglas C. Schmidt and Charles D. Cranor - Half Sync/Half Async](http://www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf) diff --git a/intercepting-filter/index.md b/intercepting-filter/index.md index 66cf04b62..9625e445d 100644 --- a/intercepting-filter/index.md +++ b/intercepting-filter/index.md @@ -17,3 +17,7 @@ post-processing to requests from a client to a target * a system uses pre-processing or post-processing requests * a system should do the authentication/ authorization/ logging or tracking of request and then pass the requests to corresponding handlers * you want a modular approach to configuring pre-processing and post-processing schemes + +**Credits:** + +* [TutorialsPoint - Intercepting Filter](http://www.tutorialspoint.com/design_pattern/intercepting_filter_pattern.htm) diff --git a/model-view-controller/index.md b/model-view-controller/index.md index 5a12bc656..f96daf243 100644 --- a/model-view-controller/index.md +++ b/model-view-controller/index.md @@ -17,3 +17,7 @@ display. **Applicability:** Use the Model-View-Controller pattern when * you want to clearly separate the domain data from its user interface representation + +**Credits:** + +* [Trygve Reenskaug - Model-view-controller](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) diff --git a/naked-objects/index.md b/naked-objects/index.md index cef2a9ede..805cea810 100644 --- a/naked-objects/index.md +++ b/naked-objects/index.md @@ -22,3 +22,7 @@ everything else is autogenerated by the framework. **Real world examples:** * [Apache Isis](https://isis.apache.org/) + +**Credits:** + +* [Richard Pawson - Naked Objects](http://downloads.nakedobjects.net/resources/Pawson%20thesis.pdf) diff --git a/service-layer/index.md b/service-layer/index.md index 22afc1669..f9e7ac1cb 100644 --- a/service-layer/index.md +++ b/service-layer/index.md @@ -20,3 +20,7 @@ its business logic. The Service Layer fulfills this role. * you want to encapsulate domain logic under API * you need to implement multiple interfaces with common logic and data + +**Credits:** + +* [Martin Fowler - Service Layer](http://martinfowler.com/eaaCatalog/serviceLayer.html) diff --git a/specification/index.md b/specification/index.md index 2609f50e5..6b76d5102 100644 --- a/specification/index.md +++ b/specification/index.md @@ -18,3 +18,7 @@ order * you need to select a subset of objects based on some criteria, and to refresh the selection at various times * you need to check that only suitable objects are used for a certain role (validation) + +**Credits:** + +* [Martin Fowler - Specifications](http://martinfowler.com/apsupp/spec.pdf) diff --git a/step-builder/index.md b/step-builder/index.md index 636504598..766479358 100644 --- a/step-builder/index.md +++ b/step-builder/index.md @@ -13,3 +13,7 @@ The user experience will be much more improved by the fact that he will only see ![alt text](./etc/step-builder.png "Step Builder") **Applicability:** Use the Step Builder pattern when the algorithm for creating a complex object should be independent of the parts that make up the object and how they're assembled the construction process must allow different representations for the object that's constructed when in the process of constructing the order is important. + +**Credits:** + +* [Marco Castigliego - Step Builder](http://rdafbn.blogspot.co.uk/2012/07/step-builder-pattern_28.html) diff --git a/tolerant-reader/index.md b/tolerant-reader/index.md index 7e0ef4f32..b2bfd376a 100644 --- a/tolerant-reader/index.md +++ b/tolerant-reader/index.md @@ -17,3 +17,7 @@ changes, the readers must not break. **Applicability:** Use the Tolerant Reader pattern when * the communication schema can evolve and change and yet the receiving side should not break + +**Credits:** + +* [Martin Fowler - Tolerant Reader](http://martinfowler.com/bliki/TolerantReader.html) From 2c9288b83ad40a50d35b36728ae1016c5f17f4cb Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Thu, 3 Sep 2015 16:22:26 +0200 Subject: [PATCH 23/24] Jekyll does not like enumerations w/o blank lines --- flyweight/index.md | 1 + interpreter/index.md | 1 + model-view-presenter/index.md | 1 + 3 files changed, 3 insertions(+) diff --git a/flyweight/index.md b/flyweight/index.md index 699c1ed54..85fa54ad1 100644 --- a/flyweight/index.md +++ b/flyweight/index.md @@ -15,6 +15,7 @@ efficiently. **Applicability:** The Flyweight pattern's effectiveness depends heavily on how and where it's used. Apply the Flyweight pattern when all of the following are true + * an application uses a large number of objects * storage costs are high because of the sheer quantity of objects * most object state can be made extrinsic diff --git a/interpreter/index.md b/interpreter/index.md index 40030917a..c7c4539d5 100644 --- a/interpreter/index.md +++ b/interpreter/index.md @@ -16,5 +16,6 @@ language. **Applicability:** Use the Interpreter pattern when there is a language to interpret, and you can represent statements in the language as abstract syntax trees. The Interpreter pattern works best when + * the grammar is simple. For complex grammars, the class hierarchy for the grammar becomes large and unmanageable. Tools such as parser generators are a better alternative in such cases. They can interpret expressions without building abstract syntax trees, which can save space and possibly time * efficiency is not a critical concern. The most efficient interpreters are usually not implemented by interpreting parse trees directly but by first translating them into another form. For example, regular expressions are often transformed into state machines. But even then, the translator can be implemented by the Interpreter pattern, so the pattern is still applicable diff --git a/model-view-presenter/index.md b/model-view-presenter/index.md index 6b0994077..609c59c13 100644 --- a/model-view-presenter/index.md +++ b/model-view-presenter/index.md @@ -14,5 +14,6 @@ developers to build and test user interfaces. **Applicability:** Use the Model-View-Presenter in any of the following situations + * when you want to improve the "Separation of Concerns" principle in presentation logic * when a user interface development and testing is necessary. From 5956873fc9d7069c4386cafc18cda143e82e6b91 Mon Sep 17 00:00:00 2001 From: Alan Date: Sat, 5 Sep 2015 00:31:35 +0100 Subject: [PATCH 24/24] Improved unit tests so assertions are used. --- .../com/iluwatar/abstractfactory/App.java | 68 ++++++++++++---- .../com/iluwatar/abstractfactory/Army.java | 1 + .../com/iluwatar/abstractfactory/Castle.java | 1 + .../com/iluwatar/abstractfactory/ElfArmy.java | 9 ++- .../iluwatar/abstractfactory/ElfCastle.java | 9 ++- .../com/iluwatar/abstractfactory/ElfKing.java | 7 +- .../com/iluwatar/abstractfactory/King.java | 1 + .../com/iluwatar/abstractfactory/OrcArmy.java | 9 ++- .../iluwatar/abstractfactory/OrcCastle.java | 9 ++- .../com/iluwatar/abstractfactory/OrcKing.java | 7 +- .../com/iluwatar/abstractfactory/AppTest.java | 79 ++++++++++++++++--- 11 files changed, 152 insertions(+), 48 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index d18f1abed..29e9272f6 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -1,5 +1,6 @@ package com.iluwatar.abstractfactory; + /** * * The essence of the Abstract Factory pattern is a factory interface @@ -12,26 +13,61 @@ package com.iluwatar.abstractfactory; */ public class App { - /** - * Program entry point - * @param args command line arguments - */ - public static void main(String[] args) { - createKingdom(new ElfKingdomFactory()); - createKingdom(new OrcKingdomFactory()); - } + private King king; + private Castle castle; + private Army army; /** * Creates kingdom * @param factory */ - public static void createKingdom(KingdomFactory factory) { - King king = factory.createKing(); - Castle castle = factory.createCastle(); - Army army = factory.createArmy(); - System.out.println("The kingdom was created."); - System.out.println(king); - System.out.println(castle); - System.out.println(army); + public void createKingdom(final KingdomFactory factory) { + setKing(factory.createKing()); + setCastle(factory.createCastle()); + setArmy(factory.createArmy()); + } + + ElfKingdomFactory getElfKingdomFactory() { + return new ElfKingdomFactory(); + } + + OrcKingdomFactory getOrcKingdomFactory() { + return new OrcKingdomFactory(); + } + + King getKing(final KingdomFactory factory) { + return factory.createKing(); + } + + Castle getCastle(final KingdomFactory factory) { + return factory.createCastle(); + } + + Army getArmy(final KingdomFactory factory) { + return factory.createArmy(); + } + + public King getKing() { + return king; + } + + private void setKing(final King king) { + this.king = king; + } + + public Castle getCastle() { + return castle; + } + + private void setCastle(final Castle castle) { + this.castle = castle; + } + + public Army getArmy() { + return army; + } + + private void setArmy(final Army army) { + this.army = army; } } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Army.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Army.java index 225331517..333b5c2cd 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Army.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Army.java @@ -7,4 +7,5 @@ package com.iluwatar.abstractfactory; */ public interface Army { + String getDescription(); } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Castle.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Castle.java index 272a97bf3..0290cb67c 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Castle.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/Castle.java @@ -7,4 +7,5 @@ package com.iluwatar.abstractfactory; */ public interface Castle { + String getDescription(); } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfArmy.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfArmy.java index d77fe8ebd..410f46951 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfArmy.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfArmy.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class ElfArmy implements Army { - @Override - public String toString() { - return "This is the Elven Army!"; - } + static final String DESCRIPTION = "This is the Elven Army!"; + @Override + public String getDescription() { + return DESCRIPTION; + } } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfCastle.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfCastle.java index 5c2b2a62a..fe2e9a0e7 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfCastle.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfCastle.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class ElfCastle implements Castle { - @Override - public String toString() { - return "This is the Elven castle!"; - } + static final String DESCRIPTION = "This is the Elven castle!"; + @Override + public String getDescription() { + return DESCRIPTION; + } } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfKing.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfKing.java index df475a354..66571ee01 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfKing.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/ElfKing.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class ElfKing implements King { + static final String DESCRIPTION = "This is the Elven king!"; + @Override - public String toString() { - return "This is the Elven king!"; + public String getDescription() { + return DESCRIPTION; } - } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/King.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/King.java index 0b75dbb0a..c7b9a867c 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/King.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/King.java @@ -7,4 +7,5 @@ package com.iluwatar.abstractfactory; */ public interface King { + String getDescription(); } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcArmy.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcArmy.java index d331252dc..108700511 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcArmy.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcArmy.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class OrcArmy implements Army { - @Override - public String toString() { - return "This is the Orcish Army!"; - } + static final String DESCRIPTION = "This is the Orc Army!"; + @Override + public String getDescription() { + return DESCRIPTION; + } } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcCastle.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcCastle.java index fd09d9c17..5012f9200 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcCastle.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcCastle.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class OrcCastle implements Castle { - @Override - public String toString() { - return "This is the Orcish castle!"; - } + static final String DESCRIPTION = "This is the Orc castle!"; + @Override + public String getDescription() { + return DESCRIPTION; + } } diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcKing.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcKing.java index 5bae8f31b..a5657d4e4 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcKing.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/OrcKing.java @@ -7,9 +7,10 @@ package com.iluwatar.abstractfactory; */ public class OrcKing implements King { +static final String DESCRIPTION = "This is the Orc king!"; + @Override - public String toString() { - return "This is the Orc king!"; + public String getDescription() { + return DESCRIPTION; } - } diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java index 91db0a4be..78cdf8a44 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AppTest.java @@ -1,18 +1,77 @@ package com.iluwatar.abstractfactory; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; import org.junit.Test; -import com.iluwatar.abstractfactory.App; - -/** - * - * Application test - * - */ public class AppTest { + private App app = new App();; + private KingdomFactory elfFactory; + private KingdomFactory orcFactory; + + @Before + public void setUp() { + elfFactory = app.getElfKingdomFactory(); + orcFactory = app.getOrcKingdomFactory(); + } + @Test - public void test() { - String[] args = {}; - App.main(args); + public void king() { + final King elfKing = app.getKing(elfFactory); + assertTrue(elfKing instanceof ElfKing); + assertEquals(ElfKing.DESCRIPTION, elfKing.getDescription()); + final King orcKing = app.getKing(orcFactory); + assertTrue(orcKing instanceof OrcKing); + assertEquals(OrcKing.DESCRIPTION, orcKing.getDescription()); + } + + @Test + public void castle() { + final Castle elfCastle = app.getCastle(elfFactory); + assertTrue(elfCastle instanceof ElfCastle); + assertEquals(ElfCastle.DESCRIPTION, elfCastle.getDescription()); + final Castle orcCastle = app.getCastle(orcFactory); + assertTrue(orcCastle instanceof OrcCastle); + assertEquals(OrcCastle.DESCRIPTION, orcCastle.getDescription()); + } + + @Test + public void army() { + final Army elfArmy = app.getArmy(elfFactory); + assertTrue(elfArmy instanceof ElfArmy); + assertEquals(ElfArmy.DESCRIPTION, elfArmy.getDescription()); + final Army orcArmy = app.getArmy(orcFactory); + assertTrue(orcArmy instanceof OrcArmy); + assertEquals(OrcArmy.DESCRIPTION, orcArmy.getDescription()); + } + + @Test + public void createElfKingdom() { + app.createKingdom(elfFactory); + final King king = app.getKing(); + final Castle castle = app.getCastle(); + final Army army = app.getArmy(); + assertTrue(king instanceof ElfKing); + assertEquals(ElfKing.DESCRIPTION, king.getDescription()); + assertTrue(castle instanceof ElfCastle); + assertEquals(ElfCastle.DESCRIPTION, castle.getDescription()); + assertTrue(army instanceof ElfArmy); + assertEquals(ElfArmy.DESCRIPTION, army.getDescription()); + } + + @Test + public void createOrcKingdom() { + app.createKingdom(orcFactory); + final King king = app.getKing(); + final Castle castle = app.getCastle(); + final Army army = app.getArmy(); + assertTrue(king instanceof OrcKing); + assertEquals(OrcKing.DESCRIPTION, king.getDescription()); + assertTrue(castle instanceof OrcCastle); + assertEquals(OrcCastle.DESCRIPTION, castle.getDescription()); + assertTrue(army instanceof OrcArmy); + assertEquals(OrcArmy.DESCRIPTION, army.getDescription()); } }