From 30363cbb7f47b3fd8173c318663d01fc4513679b Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sat, 26 Dec 2015 22:05:12 +0000 Subject: [PATCH 01/13] Create maven module for delegation pattern #324 --- delegation/pom.xml | 39 +++++++++++++++++++++++++++++++++++++++ pom.xml | 1 + 2 files changed, 40 insertions(+) create mode 100644 delegation/pom.xml diff --git a/delegation/pom.xml b/delegation/pom.xml new file mode 100644 index 000000000..96c1fc952 --- /dev/null +++ b/delegation/pom.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ The MIT License (MIT) + ~ + ~ Copyright (c) 2015 Orange Foundry + ~ + ~ Permission is hereby granted, free of charge, to any person obtaining a copy + ~ of this software and associated documentation files (the "Software"), to deal + ~ in the Software without restriction, including without limitation the rights + ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + ~ copies of the Software, and to permit persons to whom the Software is + ~ furnished to do so, subject to the following conditions: + ~ + ~ The above copyright notice and this permission notice shall be included in + ~ all copies or substantial portions of the Software. + ~ + ~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + ~ THE SOFTWARE. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>java-design-patterns</artifactId> + <groupId>com.iluwatar</groupId> + <version>1.9.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>delegation</artifactId> + + +</project> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9fa150dd4..c0c326d57 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,7 @@ <module>reactor</module> <module>caching</module> <module>publish-subscribe</module> + <module>delegation</module> </modules> <dependencyManagement> From bdacfe30c1bc68ae420d7d32e8f409762771ddd2 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sat, 26 Dec 2015 22:20:53 +0000 Subject: [PATCH 02/13] Added skeleton code for delegation pattern #324 --- .../delegation/simple/Controller.java | 14 +++++++++++ .../iluwatar/delegation/simple/Printer.java | 6 +++++ .../delegation/simple/PrinterController.java | 13 ++++++++++ .../simple/printers/CanonPrinter.java | 12 ++++++++++ .../simple/printers/EpsonPrinter.java | 12 ++++++++++ .../delegation/simple/printers/HPPrinter.java | 12 ++++++++++ .../iluwatar/delegation/simple/AppTest.java | 24 +++++++++++++++++++ 7 files changed, 93 insertions(+) create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java create mode 100644 delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java b/delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java new file mode 100644 index 000000000..487b827eb --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java @@ -0,0 +1,14 @@ +package com.iluwatar.delegation.simple; + +public abstract class Controller<T extends Printer> { + + private Printer printer; + + public Controller(Printer printer) { + this.printer = printer; + } + + protected Printer getPrinter() { + return printer; + } +} diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java new file mode 100644 index 000000000..1bc0dd13d --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java @@ -0,0 +1,6 @@ +package com.iluwatar.delegation.simple; + +public interface Printer { + + void print(final String message); +} diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java new file mode 100644 index 000000000..5fb8742a3 --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -0,0 +1,13 @@ +package com.iluwatar.delegation.simple; + +public class PrinterController extends Controller implements Printer { + + public PrinterController(Printer printer) { + super(printer); + } + + @Override + public void print(String message) { + getPrinter().print(message); + } +} diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java new file mode 100644 index 000000000..76afd5309 --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java @@ -0,0 +1,12 @@ +package com.iluwatar.delegation.simple.printers; + +import com.iluwatar.delegation.simple.Printer; + +public class CanonPrinter implements Printer { + + @Override + public void print(String message) { + System.out.println("Canon Printer : " + message); + } + +} diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java new file mode 100644 index 000000000..cc371fd68 --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java @@ -0,0 +1,12 @@ +package com.iluwatar.delegation.simple.printers; + +import com.iluwatar.delegation.simple.Printer; + +public class EpsonPrinter implements Printer{ + + @Override + public void print(String message) { + System.out.println("Epson Printer : " + message); + } + +} diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java new file mode 100644 index 000000000..7c57ee43b --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java @@ -0,0 +1,12 @@ +package com.iluwatar.delegation.simple.printers; + +import com.iluwatar.delegation.simple.Printer; + +public class HPPrinter implements Printer { + + @Override + public void print(String message) { + System.out.println("HP Printer : " + message); + } + +} diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java new file mode 100644 index 000000000..fc8d277a7 --- /dev/null +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -0,0 +1,24 @@ +package com.iluwatar.delegation.simple; + +import com.iluwatar.delegation.simple.printers.CanonPrinter; +import com.iluwatar.delegation.simple.printers.EpsonPrinter; +import com.iluwatar.delegation.simple.printers.HPPrinter; + +public class AppTest { + + public static final String MESSAGE_TO_PRINT = "hello world"; + + public static void main(String args[]) { + Printer hpPrinter = new HPPrinter(); + Printer canonPrinter = new CanonPrinter(); + Printer epsonPrinter = new EpsonPrinter(); + + PrinterController hpPrinterController = new PrinterController(hpPrinter); + PrinterController canonPrinterController = new PrinterController(canonPrinter); + PrinterController epsonPrinterController = new PrinterController(epsonPrinter); + + hpPrinterController.print(MESSAGE_TO_PRINT); + canonPrinterController.print(MESSAGE_TO_PRINT); + epsonPrinterController.print(MESSAGE_TO_PRINT); + } +} From c3184255bfed20a9d365790e87839300d1f8f1bd Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sat, 26 Dec 2015 22:29:45 +0000 Subject: [PATCH 03/13] Add template index.md for population later #324 --- delegation/index.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 delegation/index.md diff --git a/delegation/index.md b/delegation/index.md new file mode 100644 index 000000000..a36821668 --- /dev/null +++ b/delegation/index.md @@ -0,0 +1,28 @@ +--- # 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 + + + +**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) \ No newline at end of file From f0ff8ad4b321af3977f25bf1617764459ade5ea9 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sat, 26 Dec 2015 22:55:12 +0000 Subject: [PATCH 04/13] Created a unit test for build, added junit to pom for delegation maven module. #324 --- delegation/pom.xml | 8 +++++++- .../test/java/com/iluwatar/delegation/simple/AppTest.java | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/delegation/pom.xml b/delegation/pom.xml index 96c1fc952..47dbc3844 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -35,5 +35,11 @@ <artifactId>delegation</artifactId> - + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index fc8d277a7..642fc218e 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -3,12 +3,14 @@ package com.iluwatar.delegation.simple; import com.iluwatar.delegation.simple.printers.CanonPrinter; import com.iluwatar.delegation.simple.printers.EpsonPrinter; import com.iluwatar.delegation.simple.printers.HPPrinter; +import org.junit.Test; public class AppTest { public static final String MESSAGE_TO_PRINT = "hello world"; - public static void main(String args[]) { + @Test + public static void main() { Printer hpPrinter = new HPPrinter(); Printer canonPrinter = new CanonPrinter(); Printer epsonPrinter = new EpsonPrinter(); From 84fd2348eaba41b62507066b9bd0ddc85f707b2e Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sat, 26 Dec 2015 23:02:45 +0000 Subject: [PATCH 05/13] 3am Code is starting to show. Get this build working. #324 --- .../src/test/java/com/iluwatar/delegation/simple/AppTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index 642fc218e..7ce5d71f1 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -10,7 +10,7 @@ public class AppTest { public static final String MESSAGE_TO_PRINT = "hello world"; @Test - public static void main() { + public void main() { Printer hpPrinter = new HPPrinter(); Printer canonPrinter = new CanonPrinter(); Printer epsonPrinter = new EpsonPrinter(); From fb0617e9c5d18372fc785c4c096411bc7f744c4c Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sun, 27 Dec 2015 13:59:50 +0000 Subject: [PATCH 06/13] Make AppTest.java match other patterns and update AppTest.java to match other patterns #324 --- .../delegation/simple/printers/App.java | 24 +++++++++++++++++++ .../iluwatar/delegation/simple/AppTest.java | 24 +++++-------------- 2 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java new file mode 100644 index 000000000..7668637f7 --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java @@ -0,0 +1,24 @@ +package com.iluwatar.delegation.simple.printers; + +import com.iluwatar.delegation.simple.Printer; +import com.iluwatar.delegation.simple.PrinterController; + +public class App { + + public static final String MESSAGE_TO_PRINT = "hello world"; + + public static void main(String[] args) { + Printer hpPrinter = new HPPrinter(); + Printer canonPrinter = new CanonPrinter(); + Printer epsonPrinter = new EpsonPrinter(); + + PrinterController hpPrinterController = new PrinterController(hpPrinter); + PrinterController canonPrinterController = new PrinterController(canonPrinter); + PrinterController epsonPrinterController = new PrinterController(epsonPrinter); + + hpPrinterController.print(MESSAGE_TO_PRINT); + canonPrinterController.print(MESSAGE_TO_PRINT); + epsonPrinterController.print(MESSAGE_TO_PRINT); + } + +} diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index 7ce5d71f1..545f62d12 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -1,26 +1,14 @@ package com.iluwatar.delegation.simple; -import com.iluwatar.delegation.simple.printers.CanonPrinter; -import com.iluwatar.delegation.simple.printers.EpsonPrinter; -import com.iluwatar.delegation.simple.printers.HPPrinter; +import com.iluwatar.delegation.simple.printers.App; import org.junit.Test; public class AppTest { - public static final String MESSAGE_TO_PRINT = "hello world"; + @Test + public void test() { + String[] args = {}; + App.main(args); + } - @Test - public void main() { - Printer hpPrinter = new HPPrinter(); - Printer canonPrinter = new CanonPrinter(); - Printer epsonPrinter = new EpsonPrinter(); - - PrinterController hpPrinterController = new PrinterController(hpPrinter); - PrinterController canonPrinterController = new PrinterController(canonPrinter); - PrinterController epsonPrinterController = new PrinterController(epsonPrinter); - - hpPrinterController.print(MESSAGE_TO_PRINT); - canonPrinterController.print(MESSAGE_TO_PRINT); - epsonPrinterController.print(MESSAGE_TO_PRINT); - } } From a49dbefb56fbb16ef3f181c6e2e09cbe314bc529 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sun, 27 Dec 2015 14:10:49 +0000 Subject: [PATCH 07/13] Add simple tests for delegate pattern #324 --- delegation/pom.xml | 6 +++ ...er.java => AbstractPrinterController.java} | 4 +- .../delegation/simple/PrinterController.java | 2 +- .../delegation/simple/printers/App.java | 12 ++---- .../delegation/simple/DelegateTest.java | 43 +++++++++++++++++++ 5 files changed, 56 insertions(+), 11 deletions(-) rename delegation/src/main/java/com/iluwatar/delegation/simple/{Controller.java => AbstractPrinterController.java} (55%) create mode 100644 delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java diff --git a/delegation/pom.xml b/delegation/pom.xml index 47dbc3844..08b7df748 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -41,5 +41,11 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.github.stefanbirkner</groupId> + <artifactId>system-rules</artifactId> + <version>1.14.0</version> + <scope>test</scope> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java similarity index 55% rename from delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java rename to delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java index 487b827eb..e58acd0c3 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/Controller.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java @@ -1,10 +1,10 @@ package com.iluwatar.delegation.simple; -public abstract class Controller<T extends Printer> { +public abstract class AbstractPrinterController<T extends Printer> implements Printer{ private Printer printer; - public Controller(Printer printer) { + public AbstractPrinterController(Printer printer) { this.printer = printer; } diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java index 5fb8742a3..f282be128 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -1,6 +1,6 @@ package com.iluwatar.delegation.simple; -public class PrinterController extends Controller implements Printer { +public class PrinterController extends AbstractPrinterController { public PrinterController(Printer printer) { super(printer); diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java index 7668637f7..6dc2e4878 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java @@ -1,6 +1,6 @@ package com.iluwatar.delegation.simple.printers; -import com.iluwatar.delegation.simple.Printer; +import com.iluwatar.delegation.simple.AbstractPrinterController; import com.iluwatar.delegation.simple.PrinterController; public class App { @@ -8,13 +8,9 @@ public class App { public static final String MESSAGE_TO_PRINT = "hello world"; public static void main(String[] args) { - Printer hpPrinter = new HPPrinter(); - Printer canonPrinter = new CanonPrinter(); - Printer epsonPrinter = new EpsonPrinter(); - - PrinterController hpPrinterController = new PrinterController(hpPrinter); - PrinterController canonPrinterController = new PrinterController(canonPrinter); - PrinterController epsonPrinterController = new PrinterController(epsonPrinter); + AbstractPrinterController hpPrinterController = new PrinterController(new HPPrinter()); + AbstractPrinterController canonPrinterController = new PrinterController(new CanonPrinter()); + AbstractPrinterController epsonPrinterController = new PrinterController(new EpsonPrinter()); hpPrinterController.print(MESSAGE_TO_PRINT); canonPrinterController.print(MESSAGE_TO_PRINT); diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java new file mode 100644 index 000000000..db8cb4262 --- /dev/null +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -0,0 +1,43 @@ +package com.iluwatar.delegation.simple; + +import com.iluwatar.delegation.simple.printers.CanonPrinter; +import com.iluwatar.delegation.simple.printers.EpsonPrinter; +import com.iluwatar.delegation.simple.printers.HPPrinter; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.SystemOutRule; + +import static org.junit.Assert.assertEquals; + +public class DelegateTest { + + private static final String MESSAGE = "Test Message Printed"; + + @Rule + public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); + + @Test + public void testCanonPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new CanonPrinter()); + abstractController.print(MESSAGE); + + assertEquals("Canon Printer : Test Message Printed\n", systemOutRule.getLog()); + } + + @Test + public void testHPPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new HPPrinter()); + abstractController.print(MESSAGE); + + assertEquals("HP Printer : Test Message Printed\n", systemOutRule.getLog()); + } + + @Test + public void testEpsonPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new EpsonPrinter()); + abstractController.print(MESSAGE); + + assertEquals("Epson Printer : Test Message Printed\n", systemOutRule.getLog()); + } + +} From 32e71814786c6e92cf8d1fa6a5a0f2c77ee8327a Mon Sep 17 00:00:00 2001 From: Jeroen Meulemeester <jeroen.meulemeester@gmail.com> Date: Sun, 27 Dec 2015 18:13:34 +0100 Subject: [PATCH 08/13] Generate UML for delegation pattern --- delegation/etc/delegation.png | Bin 0 -> 22795 bytes delegation/etc/delegation.ucls | 97 +++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 delegation/etc/delegation.png create mode 100644 delegation/etc/delegation.ucls diff --git a/delegation/etc/delegation.png b/delegation/etc/delegation.png new file mode 100644 index 0000000000000000000000000000000000000000..95219674d28412546236e608e2a2d581df96e1dc GIT binary patch literal 22795 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%0A5arybU1U(0Jr4JF;747Hv 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 literal 0 HcmV?d00001 diff --git a/delegation/etc/delegation.ucls b/delegation/etc/delegation.ucls new file mode 100644 index 000000000..b55084116 --- /dev/null +++ b/delegation/etc/delegation.ucls @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<class-diagram version="1.1.9" icons="true" automaticImage="PNG" always-add-relationships="false" generalizations="true" + realizations="true" associations="true" dependencies="false" nesting-relationships="true" router="FAN"> + <interface id="1" language="java" name="com.iluwatar.delegation.simple.Printer" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java" binary="false" corner="BOTTOM_RIGHT"> + <position height="-1" width="-1" x="362" y="84"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </interface> + <class id="2" language="java" name="com.iluwatar.delegation.simple.AbstractPrinterController" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java" binary="false" + corner="BOTTOM_RIGHT"> + <position height="97" width="191" x="41" y="37"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </class> + <class id="3" language="java" name="com.iluwatar.delegation.simple.PrinterController" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java" binary="false" + corner="BOTTOM_RIGHT"> + <position height="-1" width="-1" x="136" y="214"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </class> + <class id="4" language="java" name="com.iluwatar.delegation.simple.printers.HPPrinter" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java" binary="false" + corner="BOTTOM_RIGHT"> + <position height="-1" width="-1" x="187" y="333"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </class> + <class id="5" language="java" name="com.iluwatar.delegation.simple.printers.EpsonPrinter" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java" binary="false" + corner="BOTTOM_RIGHT"> + <position height="-1" width="-1" x="362" y="333"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </class> + <class id="6" language="java" name="com.iluwatar.delegation.simple.printers.CanonPrinter" project="delegation" + file="/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java" binary="false" + corner="BOTTOM_RIGHT"> + <position height="-1" width="-1" x="537" y="333"/> + <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </display> + </class> + <generalization id="7"> + <end type="SOURCE" refId="3"/> + <end type="TARGET" refId="2"/> + </generalization> + <realization id="8"> + <end type="SOURCE" refId="5"/> + <end type="TARGET" refId="1"/> + </realization> + <realization id="9"> + <end type="SOURCE" refId="4"/> + <end type="TARGET" refId="1"/> + </realization> + <association id="10"> + <end type="SOURCE" refId="2" navigable="false"> + <attribute id="11" name="printer"/> + <multiplicity id="12" minimum="0" maximum="1"/> + </end> + <end type="TARGET" refId="1" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <realization id="13"> + <end type="SOURCE" refId="6"/> + <end type="TARGET" refId="1"/> + </realization> + <realization id="14"> + <end type="SOURCE" refId="2"/> + <end type="TARGET" refId="1"/> + </realization> + <classifier-display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" + sort-features="false" accessors="true" visibility="true"> + <attributes public="true" package="true" protected="true" private="true" static="true"/> + <operations public="true" package="true" protected="true" private="true" static="true"/> + </classifier-display> + <association-display labels="true" multiplicity="true"/> +</class-diagram> \ No newline at end of file From 982f9f5e31ac20796b609bbb14202d3ef7454491 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sun, 27 Dec 2015 20:09:33 +0000 Subject: [PATCH 09/13] Generic For AbstractPrinterController #324 --- .../delegation/simple/AbstractPrinterController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java index e58acd0c3..22a126948 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java @@ -2,13 +2,13 @@ package com.iluwatar.delegation.simple; public abstract class AbstractPrinterController<T extends Printer> implements Printer{ - private Printer printer; + private T printer; - public AbstractPrinterController(Printer printer) { + public AbstractPrinterController(T printer) { this.printer = printer; } - protected Printer getPrinter() { + protected T getPrinter() { return printer; } } From fac10dc454650a71b4699d1aa54594511e5ca1e0 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sun, 27 Dec 2015 20:10:48 +0000 Subject: [PATCH 10/13] Move App.java to correct Package #324 --- .../com/iluwatar/delegation/simple/{printers => }/App.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) rename delegation/src/main/java/com/iluwatar/delegation/simple/{printers => }/App.java (73%) diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java similarity index 73% rename from delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java rename to delegation/src/main/java/com/iluwatar/delegation/simple/App.java index 6dc2e4878..87ef8cdb4 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -1,7 +1,8 @@ -package com.iluwatar.delegation.simple.printers; +package com.iluwatar.delegation.simple; -import com.iluwatar.delegation.simple.AbstractPrinterController; -import com.iluwatar.delegation.simple.PrinterController; +import com.iluwatar.delegation.simple.printers.CanonPrinter; +import com.iluwatar.delegation.simple.printers.EpsonPrinter; +import com.iluwatar.delegation.simple.printers.HPPrinter; public class App { From 483db04cef5bf52671c0585248c42b2fb5b9bd03 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Sun, 27 Dec 2015 20:12:04 +0000 Subject: [PATCH 11/13] Move App.java to correct Package #324 --- .../src/test/java/com/iluwatar/delegation/simple/AppTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index 545f62d12..783a1a8ed 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -1,6 +1,5 @@ package com.iluwatar.delegation.simple; -import com.iluwatar.delegation.simple.printers.App; import org.junit.Test; public class AppTest { From 6d516d512435ee6a1c41cf34253012053800fece Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Mon, 28 Dec 2015 18:16:58 +0000 Subject: [PATCH 12/13] Populate the index.md for the delegate module #324 --- delegation/index.md | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/delegation/index.md b/delegation/index.md index a36821668..ad0bc6843 100644 --- a/delegation/index.md +++ b/delegation/index.md @@ -1,28 +1,26 @@ ---- # 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 +--- +layout: pattern +title: Delegation +folder: delegation +permalink: /patterns/delegation/ +categories: Behavioral +tags: + - Java + - Difficulty-Beginner --- -**Intent:** Makes your code awesome +**Also known as:** Proxy Chains - +**Intent:** It is a technique where an object expresses certain behavior to the outside but in +reality delegates responsibility for implementing that behaviour to an associated object. -**Applicability:** Use the Best Pattern Ever pattern when + -* you want to be the best -* you need to ... +**Applicability:** Use the Delegate pattern in order to achieve the following -**Real world examples:** +* Reduce the coupling of methods to their class +* Components that behave identically, but realize that this situation can change in the future. -* [Nowhere](http://no.where.com) \ No newline at end of file +**Credits** + +* [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) From c842f88eb74e12a4bb79cb7daee7c93d82744582 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy <luckymikuhatsune@gmail.com> Date: Mon, 28 Dec 2015 19:23:00 +0000 Subject: [PATCH 13/13] Add java documentation #324 --- .../simple/AbstractPrinterController.java | 22 ++++++++++++++++++- .../com/iluwatar/delegation/simple/App.java | 12 ++++++++++ .../iluwatar/delegation/simple/Printer.java | 14 ++++++++++++ .../delegation/simple/PrinterController.java | 8 +++++++ .../simple/printers/CanonPrinter.java | 9 ++++++++ .../simple/printers/EpsonPrinter.java | 9 ++++++++ .../delegation/simple/printers/HPPrinter.java | 9 ++++++++ 7 files changed, 82 insertions(+), 1 deletion(-) diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java index 22a126948..679c1a3a6 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java @@ -1,13 +1,33 @@ package com.iluwatar.delegation.simple; -public abstract class AbstractPrinterController<T extends Printer> implements Printer{ +/** + * Extra layer of abstraction for the controller to allow the controller in this example {@link PrinterController} to + * be as clean as possible. This just provides the default constructor and a simple getter method. The generic of T allows + * any implementation of {@link Printer} + * + * @param <T> Printer + * @see Printer + * @see PrinterController + */ +public abstract class AbstractPrinterController<T extends Printer> implements Printer { + private T printer; + /** + * @param printer instance of T {@link Printer} this instance is the delegate + */ public AbstractPrinterController(T printer) { this.printer = printer; } + /** + * Helper method to return the current instance of T {@link Printer} in order for + * the controller to call operations on the {@link Printer} + * + * @return instance of Printer + * @see Printer + */ protected T getPrinter() { return printer; } diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java index 87ef8cdb4..47cf27e8e 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -4,10 +4,22 @@ import com.iluwatar.delegation.simple.printers.CanonPrinter; import com.iluwatar.delegation.simple.printers.EpsonPrinter; import com.iluwatar.delegation.simple.printers.HPPrinter; +/** + * In this example the delegates are {@link EpsonPrinter}, {@link HPPrinter} and {@link CanonPrinter} they all implement + * {@link Printer}. The {@link AbstractPrinterController} and through inheritance {@link PrinterController} also implement + * {@link Printer}. However neither provide the functionality of {@link Printer} by printing to the screen, they actually + * call upon the instance of {@link Printer} that they were instantiated with. Therefore delegating the behaviour to + * another class. + */ public class App { public static final String MESSAGE_TO_PRINT = "hello world"; + /** + * Program entry point + * + * @param args command line args + */ public static void main(String[] args) { AbstractPrinterController hpPrinterController = new PrinterController(new HPPrinter()); AbstractPrinterController canonPrinterController = new PrinterController(new CanonPrinter()); diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java index 1bc0dd13d..aa3bebfda 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java @@ -1,6 +1,20 @@ package com.iluwatar.delegation.simple; +/** + * Interface that both the Controller and the Delegate will implement. + * + * @see com.iluwatar.delegation.simple.printers.CanonPrinter + * @see com.iluwatar.delegation.simple.printers.EpsonPrinter + * @see com.iluwatar.delegation.simple.printers.HPPrinter + * @see AbstractPrinterController + */ public interface Printer { + /** + * Method that takes a String to print to the screen. This will be implemented on both the + * controller and the delegate allowing the controller to call the same method on the delegate class. + * + * @param message to be printed to the screen + */ void print(final String message); } diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java index f282be128..98be53a2b 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -6,6 +6,14 @@ public class PrinterController extends AbstractPrinterController { super(printer); } + /** + * This method is implemented from {@link Printer} however instead on providing an + * implementation, it instead calls upon the class passed through the constructor. This is the delegate, + * hence the pattern. Therefore meaning that the caller does not care of the implementing class only the owning + * controller. + * + * @param message to be printed to the screen + */ @Override public void print(String message) { getPrinter().print(message); diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java index 76afd5309..a55e1984d 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/CanonPrinter.java @@ -2,8 +2,17 @@ package com.iluwatar.delegation.simple.printers; import com.iluwatar.delegation.simple.Printer; +/** + * Specialised Implementation of {@link Printer} for a Canon Printer, in + * this case the message to be printed is appended to "Canon Printer : " + * + * @see Printer + */ public class CanonPrinter implements Printer { + /** + * {@inheritDoc} + */ @Override public void print(String message) { System.out.println("Canon Printer : " + message); diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java index cc371fd68..bc53e2cae 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java @@ -2,8 +2,17 @@ package com.iluwatar.delegation.simple.printers; import com.iluwatar.delegation.simple.Printer; +/** + * Specialised Implementation of {@link Printer} for a Epson Printer, in + * this case the message to be printed is appended to "Epson Printer : " + * + * @see Printer + */ public class EpsonPrinter implements Printer{ + /** + * {@inheritDoc} + */ @Override public void print(String message) { System.out.println("Epson Printer : " + message); diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java index 7c57ee43b..e801ecdf0 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java @@ -2,8 +2,17 @@ package com.iluwatar.delegation.simple.printers; import com.iluwatar.delegation.simple.Printer; +/** + * Specialised Implementation of {@link Printer} for a HP Printer, in + * this case the message to be printed is appended to "HP Printer : " + * + * @see Printer + */ public class HPPrinter implements Printer { + /** + * {@inheritDoc} + */ @Override public void print(String message) { System.out.println("HP Printer : " + message);