From 30363cbb7f47b3fd8173c318663d01fc4513679b Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Sat, 26 Dec 2015 22:05:12 +0000 Subject: [PATCH 01/24] 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 00000000..96c1fc95 --- /dev/null +++ b/delegation/pom.xml @@ -0,0 +1,39 @@ + + + + + + java-design-patterns + com.iluwatar + 1.9.0-SNAPSHOT + + 4.0.0 + + delegation + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9fa150dd..c0c326d5 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,7 @@ reactor caching publish-subscribe + delegation From bdacfe30c1bc68ae420d7d32e8f409762771ddd2 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Sat, 26 Dec 2015 22:20:53 +0000 Subject: [PATCH 02/24] 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 00000000..487b827e --- /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 { + + 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 00000000..1bc0dd13 --- /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 00000000..5fb8742a --- /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 00000000..76afd530 --- /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 00000000..cc371fd6 --- /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 00000000..7c57ee43 --- /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 00000000..fc8d277a --- /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 Date: Sat, 26 Dec 2015 22:29:45 +0000 Subject: [PATCH 03/24] 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 00000000..a3682166 --- /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 + +![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) \ No newline at end of file From f0ff8ad4b321af3977f25bf1617764459ade5ea9 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Sat, 26 Dec 2015 22:55:12 +0000 Subject: [PATCH 04/24] 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 96c1fc95..47dbc384 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -35,5 +35,11 @@ delegation - + + + junit + junit + test + + \ 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 fc8d277a..642fc218 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 @@ 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 Date: Sat, 26 Dec 2015 23:02:45 +0000 Subject: [PATCH 05/24] 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 642fc218..7ce5d71f 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 Date: Sun, 27 Dec 2015 13:59:50 +0000 Subject: [PATCH 06/24] 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 00000000..7668637f --- /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 7ce5d71f..545f62d1 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 Date: Sun, 27 Dec 2015 14:10:49 +0000 Subject: [PATCH 07/24] 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 47dbc384..08b7df74 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -41,5 +41,11 @@ junit test + + com.github.stefanbirkner + system-rules + 1.14.0 + test + \ 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 487b827e..e58acd0c 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 { +public abstract class AbstractPrinterController 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 5fb8742a..f282be12 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 7668637f..6dc2e487 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 00000000..db8cb426 --- /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 Date: Sun, 27 Dec 2015 18:13:34 +0100 Subject: [PATCH 08/24] 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 00000000..b5508411 --- /dev/null +++ b/delegation/etc/delegation.ucls @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 982f9f5e31ac20796b609bbb14202d3ef7454491 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Sun, 27 Dec 2015 20:09:33 +0000 Subject: [PATCH 09/24] 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 e58acd0c..22a12694 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 @@ public abstract class AbstractPrinterController 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 Date: Sun, 27 Dec 2015 20:10:48 +0000 Subject: [PATCH 10/24] 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 6dc2e487..87ef8cdb 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 Date: Sun, 27 Dec 2015 20:12:04 +0000 Subject: [PATCH 11/24] 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 545f62d1..783a1a8e 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 Date: Mon, 28 Dec 2015 18:16:58 +0000 Subject: [PATCH 12/24] 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 a3682166..ad0bc684 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 +--- + +**Also known as:** Proxy Chains -**Intent:** Makes your code awesome +**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. -![alt text](./etc/best_pattern.png "Best Pattern Ever") +![alt text](./etc/delegation.png "Delegate") -**Applicability:** Use the Best Pattern Ever pattern when +**Applicability:** Use the Delegate pattern in order to achieve the following -* you want to be the best -* you need to ... +* Reduce the coupling of methods to their class +* Components that behave identically, but realize that this situation can change in the future. -**Real world examples:** +**Credits** -* [Nowhere](http://no.where.com) \ No newline at end of file +* [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 Date: Mon, 28 Dec 2015 19:23:00 +0000 Subject: [PATCH 13/24] 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 22a12694..679c1a3a 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 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 Printer + * @see Printer + * @see PrinterController + */ +public abstract class AbstractPrinterController 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 87ef8cdb..47cf27e8 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.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 1bc0dd13..aa3bebfd 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 f282be12..98be53a2 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 PrinterController(Printer printer) { 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 76afd530..a55e1984 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 @@ 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 cc371fd6..bc53e2ca 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 @@ 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 7c57ee43..e801ecdf 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 @@ 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); From 0bc722f797b8a7e86f18615204a405ee8489f5ea Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Mon, 28 Dec 2015 20:34:28 +0000 Subject: [PATCH 14/24] Fix CheckStyle #324 --- .../simple/AbstractPrinterController.java | 38 +++++++++--------- .../com/iluwatar/delegation/simple/App.java | 40 +++++++++---------- .../iluwatar/delegation/simple/Printer.java | 26 ++++++------ .../delegation/simple/PrinterController.java | 30 +++++++------- .../simple/printers/CanonPrinter.java | 14 +++---- .../simple/printers/EpsonPrinter.java | 16 ++++---- .../delegation/simple/printers/HPPrinter.java | 16 ++++---- .../delegation/simple/DelegateTest.java | 4 +- 8 files changed, 93 insertions(+), 91 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 679c1a3a..4baf41a8 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java @@ -2,8 +2,8 @@ /** * 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} + * 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 Printer * @see Printer @@ -12,23 +12,23 @@ public abstract class AbstractPrinterController implements Printer { - private T printer; + private T printer; - /** - * @param printer instance of T {@link Printer} this instance is the delegate - */ - public AbstractPrinterController(T printer) { - this.printer = 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; - } + /** + * 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 47cf27e8..f0a55cc4 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -2,32 +2,32 @@ 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.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. + * 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"; + 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()); - AbstractPrinterController epsonPrinterController = new PrinterController(new EpsonPrinter()); + /** + * 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()); + AbstractPrinterController epsonPrinterController = new PrinterController(new EpsonPrinter()); - hpPrinterController.print(MESSAGE_TO_PRINT); - canonPrinterController.print(MESSAGE_TO_PRINT); - epsonPrinterController.print(MESSAGE_TO_PRINT); - } + hpPrinterController.print(MESSAGE_TO_PRINT); + canonPrinterController.print(MESSAGE_TO_PRINT); + epsonPrinterController.print(MESSAGE_TO_PRINT); + } } 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 aa3bebfd..d7a2fd7c 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java @@ -1,20 +1,22 @@ package com.iluwatar.delegation.simple; +import com.iluwatar.delegation.simple.printers.HpPrinter; + /** - * Interface that both the Controller and the Delegate will implement. + * 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 + * @see com.iluwatar.delegation.simple.printers.CanonPrinter + * @see com.iluwatar.delegation.simple.printers.EpsonPrinter + * @see 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); + /** + * 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 98be53a2..7197ba2e 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -2,20 +2,20 @@ public class PrinterController extends AbstractPrinterController { - public PrinterController(Printer printer) { - super(printer); - } + public PrinterController(Printer printer) { + 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); - } + /** + * 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 a55e1984..c1149512 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 @@ -10,12 +10,12 @@ */ public class CanonPrinter implements Printer { - /** - * {@inheritDoc} - */ - @Override - public void print(String message) { - System.out.println("Canon Printer : " + message); - } + /** + * {@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 bc53e2ca..be494ce9 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 @@ -8,14 +8,14 @@ * * @see Printer */ -public class EpsonPrinter implements Printer{ +public class EpsonPrinter implements Printer { - /** - * {@inheritDoc} - */ - @Override - public void print(String message) { - System.out.println("Epson Printer : " + message); - } + /** + * {@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 e801ecdf..a8f57e76 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 @@ -8,14 +8,14 @@ * * @see Printer */ -public class HPPrinter implements Printer { +public class HpPrinter implements Printer { - /** - * {@inheritDoc} - */ - @Override - public void print(String message) { - System.out.println("HP Printer : " + message); - } + /** + * {@inheritDoc} + */ + @Override + public void print(String message) { + System.out.println("HP Printer : " + message); + } } diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java index db8cb426..b184f52f 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -2,7 +2,7 @@ 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.HpPrinter; import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.SystemOutRule; @@ -26,7 +26,7 @@ public void testCanonPrinter() throws Exception { @Test public void testHPPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new HPPrinter()); + AbstractPrinterController abstractController = new PrinterController(new HpPrinter()); abstractController.print(MESSAGE); assertEquals("HP Printer : Test Message Printed\n", systemOutRule.getLog()); From 41593774c6c15a4fe321b4ac3cc3d5fdababd560 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Mon, 28 Dec 2015 21:56:41 +0000 Subject: [PATCH 15/24] CheckStyle reporting strange error about classname, suspect caching, forcing a clean build #324 --- .../java/com/iluwatar/delegation/simple/printers/HPPrinter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a8f57e76..93408e03 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 @@ -4,7 +4,7 @@ /** * Specialised Implementation of {@link Printer} for a HP Printer, in - * this case the message to be printed is appended to "HP Printer : " + * this case the message to be printed is appended to "HP Printer : " * * @see Printer */ From 749880e3b949bc0076d8957f9ac83c7cec424d69 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Mon, 28 Dec 2015 22:12:11 +0000 Subject: [PATCH 16/24] Messed up indexes #324 --- .../delegation/simple/printers/HPPrinter.java | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java 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 deleted file mode 100644 index 93408e03..00000000 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HPPrinter.java +++ /dev/null @@ -1,21 +0,0 @@ -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); - } - -} From 52d6e20ad971534a0da47dad8257eb39487034f6 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Mon, 28 Dec 2015 22:13:05 +0000 Subject: [PATCH 17/24] Readd File to Index#324 --- .../delegation/simple/printers/HpPrinter.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java 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 00000000..a8f57e76 --- /dev/null +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java @@ -0,0 +1,21 @@ +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); + } + +} From 17b889c31de2819f950d14e04c0a03795a5362d7 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Tue, 29 Dec 2015 22:07:52 +0000 Subject: [PATCH 18/24] Update to match checkStyle rules added for test packages #324 --- .../iluwatar/delegation/simple/AppTest.java | 10 ++--- .../delegation/simple/DelegateTest.java | 42 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) 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 783a1a8e..189baa85 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -4,10 +4,10 @@ public class AppTest { - @Test - public void test() { - String[] args = {}; - App.main(args); - } + @Test + public void test() { + String[] args = {}; + App.main(args); + } } diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java index b184f52f..79fc4cdf 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -11,33 +11,33 @@ public class DelegateTest { - private static final String MESSAGE = "Test Message Printed"; + private static final String MESSAGE = "Test Message Printed"; - @Rule - public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); + @Rule + public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); - @Test - public void testCanonPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new CanonPrinter()); - abstractController.print(MESSAGE); + @Test + public void testCanonPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new CanonPrinter()); + abstractController.print(MESSAGE); - assertEquals("Canon Printer : Test Message Printed\n", systemOutRule.getLog()); - } + assertEquals("Canon Printer : Test Message Printed\n", systemOutRule.getLog()); + } - @Test - public void testHPPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new HpPrinter()); - abstractController.print(MESSAGE); + @Test + public void testHpPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new HpPrinter()); + abstractController.print(MESSAGE); - assertEquals("HP Printer : Test Message Printed\n", systemOutRule.getLog()); - } + assertEquals("HP Printer : Test Message Printed\n", systemOutRule.getLog()); + } - @Test - public void testEpsonPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new EpsonPrinter()); - abstractController.print(MESSAGE); + @Test + public void testEpsonPrinter() throws Exception { + AbstractPrinterController abstractController = new PrinterController(new EpsonPrinter()); + abstractController.print(MESSAGE); - assertEquals("Epson Printer : Test Message Printed\n", systemOutRule.getLog()); - } + assertEquals("Epson Printer : Test Message Printed\n", systemOutRule.getLog()); + } } From d7580f5530792aa750b616dcbae6c8b10e5e3f73 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 16:56:47 +0000 Subject: [PATCH 19/24] Review Comments #324 --- delegation/pom.xml | 24 ------------- .../simple/AbstractPrinterController.java | 34 ------------------- .../com/iluwatar/delegation/simple/App.java | 6 ++-- .../iluwatar/delegation/simple/Printer.java | 1 - .../delegation/simple/PrinterController.java | 8 +++-- .../simple/printers/CanonPrinter.java | 2 +- .../simple/printers/EpsonPrinter.java | 2 +- .../delegation/simple/printers/HpPrinter.java | 2 +- .../delegation/simple/DelegateTest.java | 18 +++++----- pom.xml | 7 ++++ 10 files changed, 27 insertions(+), 77 deletions(-) delete mode 100644 delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java diff --git a/delegation/pom.xml b/delegation/pom.xml index 08b7df74..4c9d1688 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -1,27 +1,4 @@ - com.github.stefanbirkner system-rules - 1.14.0 test diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java deleted file mode 100644 index 4baf41a8..00000000 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/AbstractPrinterController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.iluwatar.delegation.simple; - -/** - * 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 Printer - * @see Printer - * @see PrinterController - */ -public abstract class AbstractPrinterController 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 f0a55cc4..e0c1ad44 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -21,9 +21,9 @@ public class App { * @param args command line args */ public static void main(String[] args) { - AbstractPrinterController hpPrinterController = new PrinterController(new HpPrinter()); - AbstractPrinterController canonPrinterController = new PrinterController(new CanonPrinter()); - AbstractPrinterController epsonPrinterController = new PrinterController(new EpsonPrinter()); + PrinterController hpPrinterController = new PrinterController(new HpPrinter()); + PrinterController canonPrinterController = new PrinterController(new CanonPrinter()); + PrinterController epsonPrinterController = new PrinterController(new EpsonPrinter()); hpPrinterController.print(MESSAGE_TO_PRINT); canonPrinterController.print(MESSAGE_TO_PRINT); 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 d7a2fd7c..b87779fd 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java @@ -8,7 +8,6 @@ * @see com.iluwatar.delegation.simple.printers.CanonPrinter * @see com.iluwatar.delegation.simple.printers.EpsonPrinter * @see HpPrinter - * @see AbstractPrinterController */ public interface 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 7197ba2e..d237f087 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -1,9 +1,11 @@ package com.iluwatar.delegation.simple; -public class PrinterController extends AbstractPrinterController { +public class PrinterController implements Printer { + + private final Printer printer; public PrinterController(Printer printer) { - super(printer); + this.printer = printer; } /** @@ -16,6 +18,6 @@ public PrinterController(Printer printer) { */ @Override public void print(String message) { - getPrinter().print(message); + printer.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 c1149512..ef638642 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 @@ -15,7 +15,7 @@ public class CanonPrinter implements Printer { */ @Override public void print(String message) { - System.out.println("Canon Printer : " + message); + System.out.print("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 be494ce9..780d12bc 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 @@ -15,7 +15,7 @@ public class EpsonPrinter implements Printer { */ @Override public void print(String message) { - System.out.println("Epson Printer : " + message); + System.out.print("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 a8f57e76..be8845ec 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 @@ -15,7 +15,7 @@ public class HpPrinter implements Printer { */ @Override public void print(String message) { - System.out.println("HP Printer : " + message); + System.out.print("HP Printer : " + message); } } diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java index 79fc4cdf..9442b303 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -18,26 +18,26 @@ public class DelegateTest { @Test public void testCanonPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new CanonPrinter()); - abstractController.print(MESSAGE); + PrinterController printerController = new PrinterController(new CanonPrinter()); + printerController.print(MESSAGE); - assertEquals("Canon Printer : Test Message Printed\n", systemOutRule.getLog()); + assertEquals("Canon Printer : Test Message Printed", systemOutRule.getLog()); } @Test public void testHpPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new HpPrinter()); - abstractController.print(MESSAGE); + PrinterController printerController = new PrinterController(new HpPrinter()); + printerController.print(MESSAGE); - assertEquals("HP Printer : Test Message Printed\n", systemOutRule.getLog()); + assertEquals("HP Printer : Test Message Printed", systemOutRule.getLog()); } @Test public void testEpsonPrinter() throws Exception { - AbstractPrinterController abstractController = new PrinterController(new EpsonPrinter()); - abstractController.print(MESSAGE); + PrinterController printerController = new PrinterController(new EpsonPrinter()); + printerController.print(MESSAGE); - assertEquals("Epson Printer : Test Message Printed\n", systemOutRule.getLog()); + assertEquals("Epson Printer : Test Message Printed", systemOutRule.getLog()); } } diff --git a/pom.xml b/pom.xml index c56b9f12..13da4198 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 2.15.3 1.2.17 18.0 + 1.14.0 abstract-factory @@ -155,6 +156,12 @@ guava ${guava.version} + + com.github.stefanbirkner + system-rules + ${systemrules.version} + test + From 45cecf68c49b6941099200daac169cb88499622b Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 17:34:50 +0000 Subject: [PATCH 20/24] Updated Class Diagram #324 --- delegation/etc/delegation.png | Bin 22795 -> 25260 bytes delegation/etc/delegation.ucls | 89 +-------------------------------- 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/delegation/etc/delegation.png b/delegation/etc/delegation.png index 95219674d28412546236e608e2a2d581df96e1dc..375ef4d6b00f30f1cb7f4dccc7d47c00f77a849a 100644 GIT binary patch literal 25260 zcmb5WbzGHy*Cl)q1!*OuK_sNRTR=$x0SRd-X{0-p5JftqMLAl{mf_Pop=62x$Q-pku)#E$e74$K4#ZP zH}B_vk|{PqxqrW;YD_m@8$qNYyne~D>*kj{IbWSQwYkxdzU%L?vMDDb=6*2lBe$}OVpsV@n0 zhy2))e@A!)JLS=JG+g*m6`#}L0S$>D{3t0;QWtRghemaWWbgLBe-j+wb-2kGB>-npJ_^7Ms>s|~-EhCMqA_SCmG$&Bv8LC!q;O#l9{`P_#OFQ%p* zXyvN)%`^_rw>Oe;*IbfS_a^6PTtyf*t|P0)Gy4>N}v5eBVGHMjX~6T zbE@WR3*N3!kpU(4bq94WhhJp)1kz}@>o#_2P2R`RShujXlBJE+|HQ}Na=znyTQhD# z>F;Y1rq~$R6gAmVv|e$HkKToio}Y@7aeqS#=a0&)b^P{bz;wvQmV8iCr9U@Sr+BG_p#Pqy`rtM-(uAMzW3$j^e+lcybW>Z zX9B{M!c4+^IEkDNh~Ma}E|$NI#1s*Maz=BmTWJX*ZiPfFZ4C6OKT??Z9UeWpCtz>4 ztVS*F;6&crGje*^-qWL$nfdbR(-&Ao%r{6qWNf(%7HU_AN``FahDM6rw!9sEFE0GP zeM`NQ+xzqWU8x-DyNmNYT22hu6bMgAdwq)7hf)$~{x>WerNrDF_tr(|HAlOUwBykGs?vpmG5Y~;}FIqON>x8fNsNM2avd&zBB|EE9ZuG`b69ZS7~ zd0ItsxM7M7(*+OSzP90Tv~TdN*q9u3?T$~>Tivj>dc#Fe7r4-E;kX(rl0HArQ>B#n zl#A<2eSo?yD$%PjQ7Pj{)I9By^14%*=Y8X4+QoHG30-@g^L1 zKs9W1b$FgxgVALpNg!dh@blxmV&fK5Wlq$bN;I$(+ev;U1!3vLjY$ETI)=WCVkY;v zmfT*Mc65L7fB^L$aH-lMmW+RIWd$b%?fwI*mG3`Ky^oc8dUwlmWDJ|cwVQm0g3C+|L$zIY^@xIj?+ZIv+_Dl6oF=Vz`TsG%=&OFsa{1hz@V! zyT@elQ(CC9$}C!iDP`tDK|z%7=UrF#7FSLWw<3O&Fs2FE;}WqxTipt2steoRS>QE^(yX}Ag*^_L3O)$^1CR_M7V(D&w0HaWrC1el4EHuiZm$! zGHM)?@|}(pL!et(72W_V7>L$E74W*m+_7z`3{Uzk5*j*yV}2=f%uG*!FZFI{W|f6KaoPvPXQsie zU$*-`N16Orp5BqN2jDIjO{N_qe5`{55Dm0ncs^Nb;C8KUZH>gEz7ixfq4n->IE_>y z6?C-Rx2SL%m++abn9iX}6FfcQJ)fqiH6FRpi6?mS*NDrWR;dM*BB=lcf_^G`T54|0q?6S|g1Kdy4+) zZ=_>JhLKnAj!HG9kJ^@Qway<#X~|`#;Kxx!+Te95$FVkA^m%b-QHKNr z9TnZ5DjQI`Q^=3*0927CKfip}jjdq3OOKAo!f$VgclJ`AQhmkYba5d zDzZG3uM>KPLu6v;d9Y#K&7A)@Zzqbjn`s%2K;m+$*5T)i$Dd=91-1kx5){udrL~W1 zT?ilnMnbxjjW{Ufgv4`kY+<+)duDINrg!8u-^K^Qv&u&2a7qX-KG%ot*Pwi!GP^Bm zPH#T<)VIS7MNWq z)GW9{&uD%y$vq)^M?AHBbzy+h;Yk|Sa9B7VV&gxrsdGU)Qar#nv%Vi z*F*%J0_%%Vv{iSy>Wdz6b7PvKmB-;Z zTz*@!6w#Xa(^Yr4(_Q+<*c6w$9CdE}nF-3u`eTY2woj`6xG4x&syRWxrgK%Fctd=_ z9G5OsmS&(?R9MT;5L2{uWuj|D8i3Tp_X!K>YHCsy5wJ?Ke;+MG7w0QzecywSk(*S& z;boPQP0jn{%=SN@#-2@x{n^Z&byLzI+cT5el(rcvqH3utBK^~@Ox#%CCFW57jw4qi zmp480>D+5#j@F&S4c*vy+b6|Fg4uZ*OrwSRCI)!an~!o+(oIaP&AG=XtH}61AC_78 zin#S<6r7)omv}QvbNQXxre$UEOvrw4l)-Uvv?LK^>%T@xjS!}hMs-_Re^Y_g7fv}R zF!6l$-Nh;6L!oF{dfmTn`7uqZBISE&`$RyDkN#$pPwObbt$okua|$6Y%H@yG2(6x= zgRj-w!K2bc9PSqnrQ$BUN2LbY+qqo_kpi!pL z_JlfQ+C25?2i`^1Mg{pAwhv5k-yvzysjoHH9C749M0K^?LP_>ZUfL2q{PXlgab;#L zg{*%?K{qIfkGvWZ;UA$VWYwP^cMoZjU6vG=Hqs9X8k%|Lq2I`qMjZ{EnJ?Qn~Ra{7<%-|a=0_wc&=Q67=q`s zhCqf5M+R--hKH;h)Qen{ z_YwwTGk?ug+i*G*7E0?xwB33u;^%7;$GrHP{2s}4I{4tQHK*z2_>KVu0*#0oKJ>z&SV7SH(3ui9pFGpFV(ym_YZPxwlj zmD>0zK4qREo!oRXFzZWoa>}N$!@D&@`MC3^pZtTe4uwV^^7pO;KAb+=U(>}bB7e%2 zW+}7v)9Yu;g zt(+>nw6t_^aImMAou-m5Zb=Z~U0W@IesVry(f`TNCsEs7_F&qA!|&1zFSP5=;$rcu zkIGmoA0SQPH8+z60Vq9}z6fKl#~@&kdGJ73L?k98v*-Kw?^88S{g8GqFV4@jK51}k z73!6l_hMpUk@MSV=P0K#?w+3>mY)L7?l>l5)&4#?nG8UX(`bFHgn9oNDRL3_rd{{e zijPOb4SXiNqP5){b&JXpVrQ$)KL+Sm?f&mqQpu{4Ci>%tVLYklpE;D{g6e8PZUczK z7S{sN3RN?tSb1R2=DkTNb1WKeZigQqCO^oQ+SdSZqsZsrE%xM2I{RjSfG=vT-DO3L zmSNpPx?5>mmE^JJXoZIDy}w8WEs1}`zC^m(zwqI2^t*R+?A0=^j&oaETl=bid2wxP zx=yw&&uaKHtL(G6qa0FpgZd84KWKIn<(3P>3K(!xbJ+mdV%a{a3|4rf{L2J>Xugw4gVXfd`=PS&|@Oe}0*Pc%pI7gQfvw->~u;ISsT z>V1+p*?7L%7*mOf)opt7Vdr1B{|Bv0UPiL9=#Cs|l!A^$)ukP}|X4l-YLe!w(jX=lnBnr)b5Xa`QSwD*pwN zdpLS(1BnoACo65`;upJ!imI#CX&>x?$?HJmdiiox6~*te>ExgyyP(4AF?jP8TdSF= zlRZnf#^Cc);<{Q~vp$opnPV*Ci@xk9a6+q(KIqrA?cIwESF5l(P8Mil^)a=cJlbD- z2}S$)O3sqYnx=7+*nKVlp@%z3+ZX3taSu-q*ghCR(MKs#`GPV^FY2Xq9Yj`DaUKUI zrVOanT(;~6>kcC<`tp|>g=wCPZ%pQ>h=|mEoNwE&D9P>5E|g2ts}t2WZq)S$D`8wKx5m;XCeZi4Aw)BuE86r-VPXpIsfu?nNS(0zd@D zxMAsg`1VK$u0vtm(;feoN~98x9+yJKwo28A^!k@OmBeSkE?gzPQ%X8QI|J^8H7N^m3oX*^Z)@ zq9T^^Tw-hTr}{2iQ^G6&Uao{oA)h2;82IYks%WAf-b8{Jw>TK}h{EcNoU|=LB zkwUK6ht~mvf6^ikKWlGGU@-v&LdxHRq!*8e+9P~CP;(B%vb;Sl#=^mNJhs0|6ci&d zJSmBwH1P=+A~4H-?#h*^2X9v&hTc`VxY+G)G%XvuI@})74jJd&I}#~|my40dMg;a` z*i)O+yB&?HON-sf$IHnbd*wDd0!%APgCF_ifBd+&U>?sw-I6^aQW?F_n>^Vm^+>8d z6q{np@m)MCsSwaCv4T$KV#$cz!%J(RE%a77Tls)tg;?`XE5NU_CdyYg5~cfnzf6KzWn}?Y1rVI9gT-- z@lScTheI(Q1$3q>n0=#9%y(5hN9>nqE)4d@wzl#IFBH#fRSS;Ycb9G?f59iK2Aaq+tec!YYB-3>N!)%e0gFq`rYX#r1leLW`2ba zXy#k8J8C;M7Xw4JdX70=XP>E2)SaIVnl@7l189>Wl(cy6=bxS3vb;_X7&a_| zS|U1tMdQ==PmeMK`Emb^v?s)aKJR4FHPBf{|8#w~spYG;D*OO$fmvw1%CI%LJTy@; zwMb1whrXxD+he!Ji7K|*$>OfZi1W+NF|QB3BF#R0FEq*~45O9ToFV1^IoV(1GHJVR zOYv_XE{-hve1|ro+;Z@}ZdLrlq#NsUulF0 zJj!i@tOU2GWzp#$;=4ZAo*B52Q1zE)`zIsc zc2Z6e+-|{>(8$*=(XF!EnrRqR zA|pA?d)@`0qJMn6Gmx#=n=HVgSIvnm%NENjE2%`?|0MBQ_oYiv6BFnBWNe%I#$@90 zm&Snt6%&A^Bg5_6?;j@fvz{Mqn>ab`mMeslaD8oWw>bLqv!{8uQ2%tS#AIQnqh+{2 zSHOOzeqk96hpgOl->M{Cn%LrZw=Ob&UZ;A>iTURSY9!CvNWtl1f}!>atls&XRhl9& zoG~#39(>~I2S5*eov5&8GW^z`D$*Y8x1xVN)_BoB08|-sApiFIA1W)y{}D!&MBQEL zb#iqzUx|$+tkvV2MQbM)+_75dA7E}ft=XKeBWBgUp%2V7C?bFPyOZU5ef?Bn9%vQiQe#R=FO^e%d!%3kzLOgxe992?VSwlO#7cmHGL z{5%*bg#;oI=@|A@O9MPl^MM`RGM!y>~-1e2wG-nlq=)h6QOS6Z+oP)5rOO$%{(dlBMPjxm&h6opXY7Fcuj)z%&dP)rKzV{Rz+8&!5Rk3`*9EMa z;5~Z7TcjVRv2O9wCnhf!X_xF7`n^>hUxUOAk_fMch)LV~qocuztC7+8!cI$bP^_v4 zWr1L1S!05RON?I{&gR*7w|r=<#E0E*Ccoc}f&ai1k|P~M@GAi`I z;243Z#Ky>=b!<96nDj?M{rdH5^^pA+hnJM9G(tkhzRa=Wjtg>7nT!$p3>z2Jn*J~w)E{k3R@G>j2zc&2b2XfPiH`Tw z#H36F|F+Pcp}FP-c%?H+bzPlP?rt@}@|ki=f&^g|uoq$~sDIfK1nT=n*WDbc0|9~Mt}-Jt!*(auy6;%*Di{Z%7L ze{#ja#&Y7stU`TVRo~hWk>^iw40nO!ZLQ1Wb4a4i^6XGAjodr#`~JMMFP=$V>8!Vu zj*>e0nvm-{2~OV4n>S;@U5*bX?Pu#fTC#nKkclEN@Tx+S@A;F1^LOb9E{pk|v z6r$N~8xv+vpK?1bDJi5wsRS&6+ve2IMgu$@Wi>T5D9_p>s4suEp!d>m-*}nvGK2(i z<3m9JId$=DBCf@t2cRgR-d#2tYy*@2+nQZUaCPuoZ zXrOC!%2GOBDJE6LNVKdS&0&6x~PrY+Hk)7g>Lfk@X= zG2eA-bMsou!E&H_C@Ch!C-{{Q9W46o=0H!W8*BdIVHqB2poYS4@v+}6xB;U;cT~cq zOCJ|anGH%fo7=M`Chd@5#r-anRv-`!M)vniz2h>8=P>NUY;SFqBVoQlKtxml!0q77 zQBF=S6rcX&U_)_*$D%JXNcj1$tJxAhCv^Sy(fQn-N1oBALnR~hJ}%(2^R)j$d>(gd z?6GNBsm4QdSNyFxr6A8?8gPF$;Uz3J6+4&t- z9vtl~UVOOUyLZ{g3306oG`yEZ8!!w%dO&jgVrO#K z$-kYUl-yN>%nNsJrojt`jQ96c4NpStX41=-FB1}o6Hcx&o~8|{`U8vJ*#s#q9k6N} z#ghT+_TST5qdsvW4OvRYq~_`!zx0|meJ&gE{MyCF-#}C;EC2rS&*8dZeRU|&oNZUR zC2D6>Ec4^QQD8T}dIH-GOc#`gjDF4vvo&Qg_?Zv(&3Dz57CsajOn>-~UCGfW)(z~6 zw8-Re0?BXY>}@(U)^Y;_1H*JK7>~Ly`{IufX&q41&vU7sLhgqkX%a+_GotDNv~D7g zMfH%t$jnS5sQQw@|%Ijn|0bqq))fAzvGdANOenFr;eHx7s4=3PIA{JS(XbcW&tKdS=8#htoi znQjpfh+2e~0nZmtddu~;MIQ%^rFcrQc}3kD9KG6`;(nXx}TiEL9;u|9c$yw{+ z91IM>Vm&03lwytx9U0OgYA2A;AZr;(oRkVRKV zi>R{=>)nlwjlVRa`9Ma2&x|Kky#@y5dv>uew!czzV*pE4_2}*NA0}rESyrOw*$J^s ztT7(RQruj}OHj@(w1602q__Qn!hS1pA+h7jr?FU2T^@f@U7e`lI6O)htIK#&fw`_I z{aFaw6+p>XQ5IkO#hnE#!U~nLcG<-AH#Fts>wq1PKs>ydB~@z)9_~xssX1oSOBC{gD+NETHNL|DS1gSiTNAYl1Dc;MKj$2K0uex8fuw&uXseTxq zKtXPgp8s24p=FwAO{YY`6Ta{;LL}KC>SW%aAf`lc_u^#Q&8+kL_u0-E%FeFhvmh)# z0X{w^t-`D0Md*00IbPMalX`)CZ``y_39V{xR$4vg5OjZgF`Ed28ThF8iSrdoY83^A zE=U{wshNjAyMJ8(QFy#jHCsKD-9aW`r=%G?aCvdMwLRZnX8IUQtff)#V0SlJ!cW|5 z>E+bt&`=Cr1>3#fKWw6OnLiHxvU*LYi<6?9Csca>4%1DN>VbiQ4xb>)hldlf|Spegi|!Bweg}#YQWIfk9rJ!AMVEZq{AfpLV=*4E-{?5`LQ; zeX{L2Vvim@3c;m(%JLN0*Vc&%&#CI?daJc}8$9XYT>eY3}c$)_f z16lGA&#GP4Ze_y;SLWt!kdk(0Cn>jh!Xmj%{>t}r-wXXN!$H>rX5(A3fHP@I_n1}q z*_|lUA3)m+`J7zZFK0)D2L!OJ6iqy4<{MR+sB;r|>hPWWJ$<{KiSb*-t953ElEfHu=uP758LO$ONlZ*Ene5}Yn-VnsdiB5ySfxfN2ExL_m((ow zfo=WfD_LpLpLXlkt@VrgR1vq$nTFH(_6Yp6sL~(LbGt7IZ%@i7vj_{nQq-r5_I|84 zm5ZIf#HdFXy#gvAt?a>_?)#NCkR{6I{9hkACqebZI9^Azz zAW+(mq<&m?LGLH%b{NX0J7T6gJ@ufa8Ra&$(cg}XJ&aSKzU~ALfZq|*CIZiYwc0~# z1_Z8ww6rwEcvj zU`ZKP|C}qA2?c}lS)AESb;;vrbFEm?fFF^qNnVG2TVvbZ>!}m_9LFth$ww2IEt31v zrV#+^y&?G`OVZmsiu%#E+&nyHDs>V*wH(ma0gVcz+P#me<>+)i1>@vlL`ZRTw&m() zt2v#Ub{y%B)HhgQ;-t76%P~*oX-ziz*jCvjc4n8ruB)Lnm8A>=ktKCbjpn=Phiun2mOAX+_+-Ra3`eBcRHD3xxq`^l(Ej$7TW#(`{uft zbV}u*3r|Oz@a~%yD$f3Yd=V*4S&ih&950MPo6@&!|M97h zZ?Nzr>Mi=~^Q|JrOXL>vw9p&s&GYq+@494o_gJ!FTfYCxaOZP5Xn)j$mu1ca1+Y`2 zc(v=@-)HHfhM09NHYo{#{L72@7xi|d0GlG7$wJqx@xT8*5-7QNCV^P9E+q4a@*m7& zu~JP2t9m#PtT_Kcu)?Ep%n}`u!lS>q56a8ni|MNM`hGI(B?~j6=?!5BU{jm94>?h}_&2pu)1l6}$P_fU)?pVft3huuB<(v0%{O0tbLFnCZwuW)4BPuJc*2J+`}f7CEL zT$v?0I=U;KZSB`DZcy}cO@7=ewT8H)TWK>6#&e79i3X?~AfAK*RM_p8Pzyox4~XK! zI)0kyn24lR?$FTO6C8hl;d#6=c(>6%AwdhkxrE;Zt8wH+8DLC!LgapiQ>pUcjgk*l~!xEny{TOwb+AW<671^QT)~AzjpCV0^qrF6s_HKR?v6fCup(T=zdi z@>a+PRoB)|jF0C|?*VrJ6}J6ExqQ=2vlQ#m!ZU7G?gRqE4{EQGJH~!U5`>M6I6{_H^sT%cq%VvL+@bK^xJf;?GGTvvf zDb|hU<0}i zFC!xpSW_c(ZpHyfPy;LkSP}*DxWZRWa`YcEGp&a|S2(Yz<$k!*jI274dumn(DEHGO z8Sb7tUw8HuQkNy;m3y}f+z;9Jr+2WoiF1n#8a`_k&HVYoHS|jP56}by zXlVXtU#f8ts^X?YtZZzDTeJNJn-dkF5IqSE4MlTXBR_Q6zY*6nS!GW?0-rx4&Q(lc z&-PPrcIGwHEYv#&rUYp~`2hi_2*yM>V{n$}rbjhQjnW~wK!fnZUP#VXX_zAeG6#qJ zL=yw^C-EfCIDJl#oDqPsFf(zm@vc}Vz18~MtRE=14Z&p)uNT3d0bKiDoC)dLNq2zc z`{ov#f*(BwYs+;lyhmT=ZV~*ffm#R9+)5EA4;NR|#lgzpGO%>`->&^@IgtwsrYA`7 z&8Ax^N2#cJM^8-VnzWu0ojxwL_*AKxVs0ivGQ7DN1rggen4?nXw$+ziC{N?Us-pz= z&L>*92as2R(rBc`e6G@dmWrC1!-W;maUJ+V|AA+tg_Lg()nqg9puw2d<+|tBmX=I| z22V9v6#p>bH4%(~ewXKN;CQhBJFoG8$dGOLnwbHjOBp!>!OV`9k3%X^$2Y=8^A zc<~}D{2HPYxmFUosHmvD(f0ObUfY=rt69X(7gh+Z9R!8Hx<^X7EfUVX1*_;+RIX&HKYHw>(fH-`DfF;~^ z>q`+L0A3Pp6S!U28f`qgzURsSeQstXam-y6S6A0~VNAr{-&+_tgLs&&5C_c$F~T>D zNC5MvTw?jZKpJ;PEG&x-NIk%wqM~}M+6x^(yhFb!hYKOM*;ui048y}{cv9(2HO>5fAx?^+q2}JEQ53CNy|}V%y%{ zR+FW1)6>^K+?c%ULWnT^d+Ven&=UZ*B~N)x6_>-Ho)Kyl8yg#BVkkjG#vv`(^d5NR z`NmN0AhZT%hkrxdmW3`AS{K6Ld#0ufIV$N_P*J&Zuwt(wt<4jd$~wzIhTKd}I$$N$ zK{H1F2uJ$3)KorS29*#A;w2T}q%V(`(;>SVn+}Jf<55A}1@jGfes;7Cy#qlZA@ge* z?-59cjV>|kj@K$O0NRw5iAjD{+y7ByWaOW%rb`IaKS#&>Gf?6FB7?!Lq1#G?i|f&< zBz80?9jU@D3agCRaZpQod3eAM5s66Cd2bKm$UQ&QD_4p!9|Y@^JpD%PcShqvh}Hu^ zygOTbpVj3y!t@662n|R)DuwMlC735Y_L_PNaOKTHV zQKKZ@pr&quhVRX_Zy5e4fX@&eu0Zgmq^2ft7_z(E?)tgV8G}b93ZGsyGBI(29ES`P z=*Vr3cf(PFGQbO1e`-5E=xlFL#n;yt!T`l@d>03Y_gB+CqXZ*gdAm+dL4l0Nya#sN z*&e9u$Zjq8Q!O?y~ zK`!iCq?h$XIg&EW#=YvFPsh)H&>Bjxu#km&74aB(9*KA8=@+3UhI09(*C6?x-RaSh z9A!|+4PxTadXHT&k{{VfM?XUvyJXw(-imrMzb(67b!18ks|)LcRw&6k)Zi00qu#x9 zhq@bNCaCTVAd(&VAzwgh0nrNU7Assv<~#ru*vTd7OY4awCxBAQDo!|FnzVL zuXi3M@p@dG)xZZc(U1nn275A*kc*&x9v#0jm{V6>4aEdk29D+qmoB(8& zBIPyC2gqe5y?XTuyc)O~VmRBg2*`I5$k@%;d|3vjdIHU|IJu}OZP$?R6yxIJf=Ce% z5D?kI4y@|Z7~mvSk_p0?MlwkI8Ttd-o}yxRbu~0Z%jBA%dK%6rpX8i>0DSP zkN^HbJ1|4zzphhD_{Iv~ievz^@YOz{GalS0p84@A2x4mJR|s)osdHHCA+^>+pPsLe zalxyTZrg*L;0w!4x{ifa=XZGlMomjg3%P;u7Mv17mbMo}t(u_#*;Q>x;d;MI-;sPB zaD{C#I8yRZb8BX#>D)j{F#PE>`(w=`p^D8 zlDdSMwj>Rl zl#w2Vu=A(Kd781!!i0$5=}-r=88+&zGWz2~CT-S+@$14g5eCrqAf{@$r#=`x>Z3Ti{aQbhzJSX43kak(i>v)(JtZ z7=ZN6#>NKT%;3U$8*8l6b`lUkcK8+3cnIRWHe-=3z1X)iVTJEaAukl^*WJ2#a~se; z>;`cb0w{3M5DyQJ^*s(Z0&em3;?edzBr$D98DpF2TB7-eXhFbiVByd0QNJToIAI5{ zODkJZw6cGTBG%h)O3KUO`WlBG`R50UTi<{1UydoOEK z$7^*cm%{fd-YcXT{Bdw`v7IQ-1^dE)A)Br60iT#y*3a*FF#+5P;7sIARIwMcjw1$=@zzeWId!WJD8Qj0B#|M!$#iMnT;{qNdw8>j7xg)alTK z0CzipJO`9N5QI-aBE`-huv>tF;SUn?$)aSLg0f&cSqb6wFV^fJbF^tX+vx_y1cHCZ zi!?DWs08&zfVuPS(=~0MkN~~y+lBW05W^~EryZ1hliN=kt+NdD{?b=d3mrI zB*>HuZ*6ZE5fSkNLywXTo5ZbI}>W_hfdTtT)97)qqBtm=0+?SVNtsUV+ESg|N z2JkSw+iPH>H}UZuFU~w*D<{YpO?s1D2TF4L-goK1dMEl$GvhY~XD>w+mioBfM zbqtJ*)&NxWtnmBX&*YY>oo-}ht8tM0kpN7TnVDITpFh*+!vcYY`aKHbHdjeWiObr^ zH$1(s&G&@mNzrf#`X%oM67(xPLm)^P_d zgU#tj!Z%Nn9}|7d3Ivo3z1ce;tI7dA_&P%3;V})(n$_rq^3HCYD)NQ%>d=~^6M%-j zLT47H`_y#i#{cu+=OU9C@6|-ZgJ>**e&!beF~rZBBbC+Ks_7q8;?OWNcl6piL&x>{ zhA!xpc{DMnMFErb9-dI^fXb>{lt#qk(GonqHL=*GaB|E>#+{Wn@$@S+rKPfno^ht{ zt_~v`+Bcifl=Y-xqOdt2wYPT{jNkFgi=S3bj5e4vFh`~wh}-&EEtyG$DU+t-pmbFJ zo%=|#(cD51HyLM^0F%iSK5a{|q+RHPaC~~qnC)7>Sy^cY4qv*=hYOzyK?dR_<7kN@IxrD(tSVocJF&+3jZy=d zoEzjx=i^B{_yb>}C-BF27g#IanSoe616GZ4()_9tx{ zTM&qCO4TVv_~+G%oGQM(`$xOPi2Lcp=(F6Xto;4P&`4y8w`*7I1%&z!8P=_@(iX;A zg*3um)w8lxF9?^69|NnG1DjDM{^I2@b2SoNJ$Lh|1;agrAFnP`v>*?L37 zBLRZdM32iFgNH}&`yOJBv)zTxhv}yR_Gyrr?>idlt>#O=B_kR)SeSv9qsgkGjd(Vm znjxL5usnQxDVR|ca_LI#-`-Bt{iwucb<vk5$iv_OZ05}HeXm(jAezzdj$#xO%xTq+-{S(Y$zL424ig>7XgP%O zn(u;N#4YQ6eTse0KZ7)`S!D2hbISM{=E8itD0+zNblqfedGOPE;M@1>wz`rM69)?2P;h9Sb~tt~A6MAO4T?H(D5z^SL7OUS7gSFW{r_$pLxfV^NTgJ^A}s z%xBjl#sA~~uHcXi$aj%cwZ5m3geZ)If()+^9IioZi1}-O^3sBSYh9K=zmQ^gt6L9+f<;h{IdzgHn~xz0inaEtw{0s4txHeI(e-)l1ky<15hBYWaxzihI`Nx3&E?)5D` za`Cfe=u zetVthwq++>H>fzngMmZw7+7+?2H?dUVBlK;ChCz*MfDy{NHHhEm5h0PybOojEKie- z`o`P?*8&4E7SC~*b^>8q{RQ@&gj$CPg~eyr6YnvcH<_;pOQg!9T9n6hOHtbw6`u}5+F|Prg9lkt*#{uAzp|3JDsI9~n8a6R! zyKSY(u0Zn_$a)ca2~~$mR`>K)Wr!D(laip*PM{$LMn^rzYh8Rc^Jee#rO(Q75VM`U z9587Uyl%p%Tj?Hk$2?yf(4YPE#23+9P*P%A-*rZ38^2`fFiSe zCf2U5joW74wX82HB+@Xa3cX)YjeLHXjCNP0aIsN28X6mktFH7CVd6}I2(Ml%ACqL# zen3-_7zUa0TU;iMDO%^LADeE7^6p?y^AGfwpnr3f1AtBsEFsFNWYdlu1kSBJ;>$e|`u56{9 z__W7n-!uG3A>R7ne3h&IGzrCT-T6_?m2Zd5+i2nXio8!B$rHrbk6E09dnwsQX3%U7bM~^cx5|LWgj)x9BN{OijVWiJG|>zf@Y8u zYL(F!2L<>Z5nv|U>Z!!1XbUNDXn05h0|s4ulSl=*>I1qn>|Q7FoXDH$b9mA7BBW&} z(DDbT+(8=$RqeY)5^~6x!b;TdVmv{Q@bpWbVgkR2U^&bR$<;X01H`#`%hg|T>wyh! zmA%CW6c&t5iB4_hXX7Rt&7FzVD`o2V?&iq5vvO@KtnGw zCP2hC`pt#}=jCZteRpu&`|W6@FzX$YZ1sLb#tb>M`2d%nMytw>Xmf2&CRuw?m{gD@ z&+%WoTYq_j&q=|sdQRT5G}(rrBIymWz>m#eUD?q9N$!yd>M!Rc24q^d_1oW6FVqtX zLQ~!#8dq2fC?fwyc|b6r)C?FXz_|b#p6e`xdsg%LOTT@`$zuBh<0^-ShHu> z+O{#7XxXeFwG-9z%}*!Qva(Xq3vcXflGksvCWLsW?d^L)? zI)TFJQO_c`#oQ-;aal!F*-?oG3jQ8(I#bFxR<+i!q+J+;`7Lv_#9FAw3|U>ycifs5 zw#YYyn&a_$qT_B{#Z4pts6<)g74V&F#^-;QTd;b5YO*%+@PmqeEH0izj{pXa`c$=# zNDPj)e1|a|ZGySjbmeK%y@nBy{U^&Zevq`8H{UAG(*#4O&)AVnV=v5?>U(7w`dao& zcvnF#OX6dBgu=r!nC@rSE1nlA?j!soQ`WjR*pfhhz9Hz%k4=UL7YZ-a8Q`(s9rW#W_0U4QcNBRKpO(Sr13 zZ8F!YK9ur9h1r^xM9_oA7InnZE+w7QM5UkWzebkJkw{QY+7^a?K0luS6aY=VF9rp_ zy`8M$8TXG1%m_10qUUu`twh2#e|E2pzdN*i_=x=9DSm+8NPoFax8k!b3Utd{Iys`C z*zLg_W=enhX_28s=z!@GqXhSkV$2OP!3rE~aHmpmCseXd-dDjNU}Wp~4SJV2ESqG+ zEWPvCQn`+4H9rpJ;lCE`@psYr*r(3Je`kYjh^S9k?-=_^}WTPyAuBa4tG+oAOo zhf`N`vf}8-dK$@KdVoD9b?aRBQ{|BtAjE65vD{WORFVJBIBz}ZWy8xo&&}}ybFu>A zYgf9H4|Th8WMHIeWr#|2tYBQ|=fOq~uMs^>NHBsl60SFFqqLpSg#n47Ob7g3QpxY` z?m>s2poFlnoO?)0{MU`iiNClik@sqcYSw=t(ElsSyeIAN44!?3-AnH7f1=5l3Y;(P z7Mn05?e5i|BJ3g=%mVlC@a=U;?Isbq7k5Dg{(qY^R2s9SWHH$)K-N^hFKJSdsQbG= zO)3&ID~<360tABIm_%L&XtUlJ$POy>GK&eAe`%Z(e=Hz-x|4_@Qea}X-arHwjdCvW z-;wZ5{y^w1hjJX*-qm&l(fijg<+mh1%1qkL#XQU5OI@U|ot|Lokn<>G^?!8lu z4KF`$OdX>$Q&aiA8;%_Dk~@a)s5oh-Ca-vA?DJ<1AIEqXf9q=#u!(|YCb_L`>EYE+ zd<|ie>T5C4_zlkOd^65>?&e6q3zO6Ta2#VdM8$G&$%Yc~q5rA6PDQWYy%k7AC63wu z(a4oRL*2ITLbhhSBw4a&tC4*RQKrZmk}PG(zDAbx+7cn8kbP_Hdn6Ib$dY{t+4r)P zoygGm?oqwp_rB-<{m$=_|b6|rLTUjZxQ!>ONW7(gxYB3kEtY_u-3mnRs&{6q*Cc zhUd2bQl@Wu?4guzb7TZ9&xTo5G262qYJ`k<*)oMHLEvt|mn^?mt{lbO%tK0AltHPF zw5bkyI$q(7T)S${30X z`-t_%Gq)i|qESX5@r*b#P-eZAj=d;k7c#0t4>yfE*2gyzgkg#nYwD${+J@EC_32%7+YmlRV zj&Rt+S;S>o6y_jviAUT*KyS>vXzZ2PhlU9dKo)wf;CO2=A zGZMw1XZ+RQ*a$fhG@?FHB7(+aZO`k}va*5ADHbR0U=Vebh2;X38E_4+=T)1b8hY53 zM)|nw6PwIeVjkEK#*P=SLh&VBAN_2}lORyE?TI_J(2)w)2CQl`NG-n8;!uTypKCW5D}tQw3%J)@M~6L z(>>X?{e7Zj&;TOFi7PZ%N*j2N)r&B0dcG~08f)FzRw|mtgP>U4BS+c;MW0pZSo^R`hcNtbuD<-8|YMH~Iv%WcR5 z0ZrQqkW}`v7t`sn`V&`hS@#>xZP^vc{Af$8sW0E^^KAJg^nllosT&`}op$Gg^FME0 zr7(;@9;EGL=1CEiUM(P?C?=FFSLPHwmR~Wf@-otqsR@d%8?p@T+Dmu`>Ta{pv|zd~ zF7lKesdBgVe%E}eY&%x)mfW2V|08#n7BV8lM@>XFQ>?e^Cfn?_+IzLEsSI0hh`kx! zozM6tU_)*QLG&LdORhUwxjI^Px-sq+X=dlh22HRc4NjAl=?jO05OC`95FZ9hRA&hI z#6v4JSu2kzeF`MDtM;gL&`HdbfAvAqhZ@>MqCw0L)zI?$A6McwA>#bW*og7Q1J z@uc`^kn^TQcO5_^Gc%O$!`Xldh>-wr@)O9>rfS1BQ~pL$`~wf{-^lgNC%>+gOd1pB zS>EuB<3O^eBDx7WYx8N$LQXIC)9aa|!mI40$b$gqSd&*Q{5|&}n1~=ebwiX!xDx## z+!Xr1TtK=idZJ)&NzX>5u0@oICA4=^Qiz?K022L9jaglO8hq1Z4#H<%vNqdOeKY;o zzBq5Ga%n8nG9Qv7ba$Wrh?Zs0KS_pQHuw7Vynbfmup&~8;;*j(IOtgdY!0Q@^|T)d zp!)b3B}G;YaS0BP>}v&jxaT#BIZt1^+LT6LJ%fyHixcLP!@rDCVwQQ;30h|}v&-&F zyMTQM$9OXO!wtI5?+LFWV9*f^Qa=HysJp~ln-1sPYqs04-ruR4j3Skw88b0i*BW5a zlmupJm+}MmRbz}I4pdNjZ-Tv3>Bi<_De!((eYTsG;BmI3cr@-h#~g-oAG_bJn2w2S z3p2N2tT-;Y?^ripV+KwWm993cU>?+>riS3SX8xBcqZK#U4GavIb4q?JvkSfUoa%)) z3yVw`^I-lZ8c{pD*0255XCnMgh&x_4n{LeQFS^^KCH>P3j$Xin5OE5bfa;?zuBRUj z)KE1tKx!g6G3XxEp;HC3J=wId`#VhTWJVV9kV4=}R@_RLqJV{1K%18%M)khCRV=Cp z@}e&;_pX7s3108u&q*Hy6CF^-gyZkN-?JF6aLp&xJ%7o$ z(lFt#D8FK2b#ubC0b+0N8X^l$SlK_0OSQ2be+gOlqOLjywU&Oya-v~BP@~b` z|EaGssR4bJUumfwkopd1$>Zm0GYxWN@7`8YBGXC;W4e2yGN#GxYJuJmIEkr5S@(R% zOivKcZ_i7+sYCY~HB_#NAp##04|RaiDxRa+U!QeZ-!&h-1e+k2+(s1WUkENB5A7y` z&H+5Ap7=2=gp#xSJit-Uv^$|N3Oy!H`}PmW><$A$`fDgn9&K2-YJ1OXvAM~fjk_g8 zgdM8LIz`yi$RjGL{kgT8>6}`gJw85$*Gx%`s0eq(Qy3^T(-mnXqqzLGaw&ggp4)=5 zHRBuIsYi-pn=68YQOM?It8BIT%f!cT)PcnX*B_E#KPqvs@xrTlu-SVl=*vw|TO}}T zl~Du)6r`^%;Jw-KDm>E-lumo%U?S>4Ea@v=*@&FG{4KNM6*(hjh7ERqJ{&2CuKp7 zNT4EcZPW45LU1*=oQh|Z;>{N5ofR#!*N>HSntE;3#)div5GAMRmAPJz9E%t8c04%y z`c8veW3tIZbY(dp_0JK%ZPOOwQsF=RY`=mqKw?IwjQqV6AFn1p$y?osHPX&1Mu<9X zJiITUWwfDxza70WDEjzKL})8D(^yV%_G~YJYacW(#Jd*4YeP?aZ-!lYoy zlOpc*AkTe?as53dHGl$5ZAWoHtVikc7rHCiruJg3Jv_FS=ALle5Fd$sBvXM@{WS{z zO&e8*NTM_>???+RHgD$q^oXB7BW*Q-&S90 zNz9w_@0l<9;H}Fn6n6Z5OULQxE}S5V#X0#W4qG$TRft(OIFpr|?sw*pNKD~-HWo>Q zKCJuA+W4o>Vh!G2+hwm`5~dCjP^jDtIP>WVC#O!RMU)4d;%SAt^W_dMnAVic@>{9x z*&G@t0T`q0OaRTp-=5nqvsa#$SxsC=ax%ZLH;&yl1lEDg*hs=QZ&~RS41Mu_!(}FS zPRl2BKu3)GrSJ0q|0f(F2Exc{`>7`etLwA)$RIAZpYu$=)Q`6Ftl6(X8y~N5`4V|^ zZ0CjV4QY=%M?@?_wCaE<3tC;e=1Hxr)N#&_MZK?-M`|7P_9NI%;`y>`9^WU=dd?{0 z1zW@B>W+BFVQ4W~r|$~AfC^c`T}{@7X*NYvu#HWXkFfgUPr82iZPYpxt3(3o5Y0k^ zLz`!(A(RcIPn(B9cll~=WLEAwmJt920EvH5hdoaj^Xp)1aWERr?gS{?+>$ccW~$z} zW~YdMn*%3v_r-}S=V&$UAGoVudrJz8s;5R?*8v8G%`E-pJ2yf7_%W zabr^?o^Y`JL}}i4v~nnS4NN>BJe9rXcOomt>^DL76Z5}2S4~+bT@R6quGnTmjgC+h z`D-^sXltD#{>a{j4c-6KuPuzzAX=INF80|$G&HPW1GOy{0Ny@e4EEXB=Q}k6Ep5`M zlAmid;DlZRo=xn3g8*Jhkl+UsUW%DDvisbqD>2)-{`O7$5s+~K_eUjGzyMlD{-k{a zrDLZaloc2k3=Bkp%g&QHhRCbGMRt+KseeWRQi1dR2U1ap^xM_d8}NJiYOR%48wW0) z#ANQ4RiIE8;fSlh!ymjs%JX= zm3MJeCe;X3eqNLB#z7|0Bw}-q{|eaR#%Al64t>G~B1^~1TB9Alts9D&U%DpnEp`s3 zRYW2XX$~2>r(WlgVa|UIK@Fk>lV~GIye6>qEH7= zRo%_j$551qhV9mD7D;Bbps0++2WC>AYK5NDf8kC2u8~vm(z8N!fzVoV?Z`lIV-XX} zPSi5%_blyFH{&);Fvy8>b?g6JsH@ZQN7^@TQ#PWKv|zjsMabKY+A5_^cd7N!XwNa! z$WF?RtZeu*%~)HkG{ON zbI-PC+H2Jl*FF{+qI}oD03;+?XJ{x-c;QnsvGuK~j~&TuDN-fN9m&|1=-g}#Z(#HB zsh#qPd-9>#aU74l;clLBs1ZancW7TlouNmhqDc2fqykTPf@u~UHc13tNY02d?!C7&|$!)JqR@x>8-3Jrd4`ln({Q2~G zR1-=liduubjDARkbc;&;4!)HtX(~;c^bv`-LW-q%Mn~Is)8bEfw!GR%Zu8MJXwQlY zE;~5W(;L5Gh;j)J#|Jb9+FT{3pWK}jMj}%~L#^HN{QT!Omj$nlA6m3^>I%XKq=fV& zBxr|4+~H`RpO@RNz~MyH1RT{h+_lKViT$leJ72YqksOp_3G3Q_exh(aCm%VEUp4O0 z>yh6rrO2+x2|vGweP2Cr0W^f;-6q8?kG+B<^@rz<#mC!B3Gg4S496W!de@jsD)4UG zw8{K-*Z8uQ%wW+Cwma@iS5oiSa&r&2w1n*7WHApMzqsEzR<60Lti0|y*!-SFX7f?f zT@$P-hZGee1&v5qjH#v|a*}4ih$@tyHX%HlGlks7xUG*VKOFtWr;G_tNAUtpU0u-Z zOxBw*mDS0jvWtSY_|@rcCUo^#Z=90#B#OlPl$Y8} z@rRgDhlWVxB_py{hRPh7!yf%0VhlVck>GE{PTd_R%z@)R#g>2a4U?^rH*)~#`!k}` zLG~Q9l(o(#EBs9pgNnb#PWpuFFp&hsWPm1(l+J+Gm{;?#SNHJk?oj`C)5a51oE!!E z>y|!vnZdz)Q|J0kI|I^=#j&u2pv$NDz1UD>&Z~`&#=d=Zab`J-P(4JW+FDCYJk~U; z^uUaC*F!I zDua8osM9}!6`YtEWDkpYywcj_A;->}1hC!=aJ+`)F$JmJS3EANsAc+EqWA1sDQxal za*?kueuUB~QvNv5kZYu*9%A1nEv0Z%{Pt&+Dk(XaEDBaFX4nuKZWK5L^wCa^@2&Oa zQ>=14(G)|IBT^V;hXp)oNhVx{6zI(Z9MN!&dA`b-g~yyBjeg&XhUC+@{^Vf7G_Ayh z3L1x7Sv_~OFR->5j7qGMV6dm_FSoz@NA>9$y3d*k93-Tjh!ls|UqgOaM4_Am#=JfD zd`U1HtK6IGHKqm2B^ml-du2+GJGM6Q_lo>2Px@Nc>~*clabv6lsTpJi&y#lQe!w=+ z|21XgeW@c{N!qE2{H?S@#hg|TDb9s;IUF9~>cU1C?B9X%>7QQ^Jg+#Xo6uce@XYT- z85~V-Gvk=e#MI%iF6GmNk4!d2n0rPrNAcJlkdqzfeQDg06qBboQ#1k{})d=cJH3hg3gK3844 T6<_9Y0DhD&YFsE%FuDIP#mU)$ literal 22795 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%0A5arybU1U(0Jr4JF;747Hv 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 diff --git a/delegation/etc/delegation.ucls b/delegation/etc/delegation.ucls index b5508411..403fb7e2 100644 --- a/delegation/etc/delegation.ucls +++ b/delegation/etc/delegation.ucls @@ -1,93 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + realizations="true" associations="true" dependencies="false" nesting-relationships="true"> From 7b323e9cb423df163d583c2b17211cdc0b3c6f84 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 17:55:42 +0000 Subject: [PATCH 21/24] Updated Class Diagram #324 --- delegation/etc/delegation.ucls | 75 +++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/delegation/etc/delegation.ucls b/delegation/etc/delegation.ucls index 403fb7e2..e3ce0887 100644 --- a/delegation/etc/delegation.ucls +++ b/delegation/etc/delegation.ucls @@ -1,6 +1,79 @@ + realizations="true" associations="true" dependencies="false" nesting-relationships="true" router="FAN"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From dec5ff22fc8044b4194f704ffd0be9edc8f8e7be Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 18:26:32 +0000 Subject: [PATCH 22/24] Update index.md #324 --- delegation/index.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/delegation/index.md b/delegation/index.md index ad0bc684..2064a5bf 100644 --- a/delegation/index.md +++ b/delegation/index.md @@ -9,7 +9,7 @@ tags: - Difficulty-Beginner --- -**Also known as:** Proxy Chains +**Also known as:** Proxy Pattern **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. @@ -23,4 +23,5 @@ reality delegates responsibility for implementing that behaviour to an associate **Credits** -* [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) +* [Delegate Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Delegation_pattern) +* [Proxy Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Proxy_pattern) \ No newline at end of file From 623c2081cd1213909ae98f65f8826140740b4485 Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 20:07:42 +0000 Subject: [PATCH 23/24] Update App.java to have more information on the pattern #324 --- .../java/com/iluwatar/delegation/simple/App.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 e0c1ad44..050380c1 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -5,11 +5,16 @@ import com.iluwatar.delegation.simple.printers.HpPrinter; /** + * The delegate pattern provides a mechanism to abstract away the implementation and control of the desired action. + * The class being called in this case {@link PrinterController} is not responsible for the actual desired action, + * but is actually delegated to a helper class either {@link CanonPrinter}, {@link EpsonPrinter} or {@link HpPrinter}. + * The consumer does not have or require knowledge of the actual class carrying out the action, only the + * container on which they are calling. + * * 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. + * {@link Printer}. The {@link PrinterController} class also implements {@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 { From ad714294dd9f1d519730916d7b12a5317948390c Mon Sep 17 00:00:00 2001 From: Joseph McCarthy Date: Wed, 30 Dec 2015 20:08:52 +0000 Subject: [PATCH 24/24] Clean up javaDocs on Printer.java #324 --- .../main/java/com/iluwatar/delegation/simple/Printer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 b87779fd..91531dfc 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/Printer.java @@ -1,12 +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; /** * 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 CanonPrinter + * @see EpsonPrinter * @see HpPrinter */ public interface Printer {