From 82d3d7bf1f359a712bc22aff224d25c8eb35d56d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 23 Nov 2016 22:03:26 +0200 Subject: [PATCH] Proxy pattern: Improve the example --- proxy/README.md | 18 +++---- proxy/etc/proxy.png | Bin 9474 -> 22953 bytes proxy/etc/proxy.ucls | 47 +++++++++++++--- proxy/etc/proxy_1.png | Bin 23587 -> 0 bytes .../src/main/java/com/iluwatar/proxy/App.java | 14 ++--- .../java/com/iluwatar/proxy/IvoryTower.java | 41 ++++++++++++++ .../main/java/com/iluwatar/proxy/Wizard.java | 2 +- .../java/com/iluwatar/proxy/WizardTower.java | 50 ++++-------------- .../com/iluwatar/proxy/WizardTowerProxy.java | 12 +++-- ...zardTowerTest.java => IvoryTowerTest.java} | 15 +++--- .../java/com/iluwatar/proxy/WizardTest.java | 7 +-- .../iluwatar/proxy/WizardTowerProxyTest.java | 11 ++-- 12 files changed, 128 insertions(+), 89 deletions(-) delete mode 100644 proxy/etc/proxy_1.png create mode 100644 proxy/src/main/java/com/iluwatar/proxy/IvoryTower.java rename proxy/src/test/java/com/iluwatar/proxy/{WizardTowerTest.java => IvoryTowerTest.java} (89%) diff --git a/proxy/README.md b/proxy/README.md index a3cdbf788..ca63a6594 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -18,24 +18,24 @@ Surrogate Provide a surrogate or placeholder for another object to control access to it. -![alt text](./etc/proxy_1.png "Proxy") +![alt text](./etc/proxy.png "Proxy") ## Applicability Proxy is applicable whenever there is a need for a more versatile or sophisticated reference to an object than a simple pointer. Here are several common situations in which the Proxy pattern is applicable -* a remote proxy provides a local representative for an object in a different address space. -* a virtual proxy creates expensive objects on demand. -* a protection proxy controls access to the original object. Protection proxies are useful when objects should have different access rights. +* Remote proxy provides a local representative for an object in a different address space. +* Virtual proxy creates expensive objects on demand. +* Protection proxy controls access to the original object. Protection proxies are useful when objects should have different access rights. ## Typical Use Case -* control access to another object -* lazy initialization -* implement logging -* facilitate network connection -* to count references to an object +* Control access to another object +* Lazy initialization +* Implement logging +* Facilitate network connection +* Count references to an object ## Real world examples diff --git a/proxy/etc/proxy.png b/proxy/etc/proxy.png index 64c61f1f251354710ebf202da9e1e277244de332..300e58dd331166ed17916edc2719e137c54154f7 100644 GIT binary patch literal 22953 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 VBqqmW{@aA5s;H$&BKLBkI5aIv; diff --git a/proxy/etc/proxy.ucls b/proxy/etc/proxy.ucls index f3906b688..76b5f0160 100644 --- a/proxy/etc/proxy.ucls +++ b/proxy/etc/proxy.ucls @@ -1,9 +1,10 @@ - + - + @@ -12,26 +13,56 @@ - + - - + + + + + + + + - + + + + + + + + + + + + + + + + + + + + - + diff --git a/proxy/etc/proxy_1.png b/proxy/etc/proxy_1.png deleted file mode 100644 index ba86fa8d62a3d75d97de809c8cfb36263b09aeeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23587 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

5})ON`^#$ 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 avE0nGTD%Mb#z% diff --git a/proxy/src/main/java/com/iluwatar/proxy/App.java b/proxy/src/main/java/com/iluwatar/proxy/App.java index 9c27cfb01..98e304428 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/App.java +++ b/proxy/src/main/java/com/iluwatar/proxy/App.java @@ -35,7 +35,7 @@ package com.iluwatar.proxy; * functionality to the object of interest without changing the object's code. *

* In this example the proxy ({@link WizardTowerProxy}) controls access to the actual object ( - * {@link WizardTower}). + * {@link IvoryTower}). * */ public class App { @@ -45,12 +45,12 @@ public class App { */ public static void main(String[] args) { - WizardTowerProxy tower = new WizardTowerProxy(); - tower.enter(new Wizard("Red wizard")); - tower.enter(new Wizard("White wizard")); - tower.enter(new Wizard("Black wizard")); - tower.enter(new Wizard("Green wizard")); - tower.enter(new Wizard("Brown wizard")); + WizardTowerProxy proxy = new WizardTowerProxy(new IvoryTower()); + proxy.enter(new Wizard("Red wizard")); + proxy.enter(new Wizard("White wizard")); + proxy.enter(new Wizard("Black wizard")); + proxy.enter(new Wizard("Green wizard")); + proxy.enter(new Wizard("Brown wizard")); } } diff --git a/proxy/src/main/java/com/iluwatar/proxy/IvoryTower.java b/proxy/src/main/java/com/iluwatar/proxy/IvoryTower.java new file mode 100644 index 000000000..de89240f8 --- /dev/null +++ b/proxy/src/main/java/com/iluwatar/proxy/IvoryTower.java @@ -0,0 +1,41 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * 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. + */ +package com.iluwatar.proxy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * The object to be proxyed. + * + */ +public class IvoryTower implements WizardTower { + + private static final Logger LOGGER = LoggerFactory.getLogger(IvoryTower.class); + + public void enter(Wizard wizard) { + LOGGER.info("{} enters the tower.", wizard); + } + +} diff --git a/proxy/src/main/java/com/iluwatar/proxy/Wizard.java b/proxy/src/main/java/com/iluwatar/proxy/Wizard.java index 5ea2e8279..099ed54cd 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/Wizard.java +++ b/proxy/src/main/java/com/iluwatar/proxy/Wizard.java @@ -29,7 +29,7 @@ package com.iluwatar.proxy; */ public class Wizard { - private String name; + private final String name; public Wizard(String name) { this.name = name; diff --git a/proxy/src/main/java/com/iluwatar/proxy/WizardTower.java b/proxy/src/main/java/com/iluwatar/proxy/WizardTower.java index d5daab305..82397931d 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/WizardTower.java +++ b/proxy/src/main/java/com/iluwatar/proxy/WizardTower.java @@ -1,41 +1,9 @@ -/** - * The MIT License - * Copyright (c) 2014 Ilkka Seppälä - * - * 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. - */ -package com.iluwatar.proxy; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - * The object to be proxyed. - * - */ -public class WizardTower { - - private static final Logger LOGGER = LoggerFactory.getLogger(WizardTower.class); - - public void enter(Wizard wizard) { - LOGGER.info("{} enters the tower.", wizard); - } - -} +package com.iluwatar.proxy; + +/** + * WizardTower interface + */ +public interface WizardTower { + + void enter(Wizard wizard); +} diff --git a/proxy/src/main/java/com/iluwatar/proxy/WizardTowerProxy.java b/proxy/src/main/java/com/iluwatar/proxy/WizardTowerProxy.java index 1048724d4..d05639101 100644 --- a/proxy/src/main/java/com/iluwatar/proxy/WizardTowerProxy.java +++ b/proxy/src/main/java/com/iluwatar/proxy/WizardTowerProxy.java @@ -27,10 +27,10 @@ import org.slf4j.LoggerFactory; /** * - * The proxy controlling access to the {@link WizardTower}. + * The proxy controlling access to the {@link IvoryTower}. * */ -public class WizardTowerProxy extends WizardTower { +public class WizardTowerProxy implements WizardTower { private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class); @@ -38,10 +38,16 @@ public class WizardTowerProxy extends WizardTower { private int numWizards; + private final WizardTower tower; + + public WizardTowerProxy(WizardTower tower) { + this.tower = tower; + } + @Override public void enter(Wizard wizard) { if (numWizards < NUM_WIZARDS_ALLOWED) { - super.enter(wizard); + tower.enter(wizard); numWizards++; } else { LOGGER.info("{} is not allowed to enter!", wizard); diff --git a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerTest.java b/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java similarity index 89% rename from proxy/src/test/java/com/iluwatar/proxy/WizardTowerTest.java rename to proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java index ab56115ca..9f884cde8 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/IvoryTowerTest.java @@ -27,21 +27,21 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.util.Arrays; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** - * Date: 12/28/15 - 9:18 PM - * - * @author Jeroen Meulemeester + * Tests for {@link IvoryTower} */ -public class WizardTowerTest { +public class IvoryTowerTest { private InMemoryAppender appender; @Before public void setUp() { - appender = new InMemoryAppender(WizardTower.class); + appender = new InMemoryAppender(IvoryTower.class); } @After @@ -58,8 +58,8 @@ public class WizardTowerTest { new Wizard("Merlin") }; - final WizardTower tower = new WizardTower(); - for (final Wizard wizard : wizards) { + IvoryTower tower = new IvoryTower(); + for (Wizard wizard : wizards) { tower.enter(wizard); } @@ -69,5 +69,4 @@ public class WizardTowerTest { assertTrue(appender.logContains("Merlin enters the tower.")); assertEquals(4, appender.getLogSize()); } - } diff --git a/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java b/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java index 56ad74c8c..1187a89a3 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/WizardTest.java @@ -27,18 +27,15 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; /** - * Date: 12/28/15 - 9:02 PM - * - * @author Jeroen Meulemeester + * Tests for {@link Wizard} */ public class WizardTest { @Test public void testToString() throws Exception { final String[] wizardNames = {"Gandalf", "Dumbledore", "Oz", "Merlin"}; - for (final String name : wizardNames) { + for (String name : wizardNames) { assertEquals(name, new Wizard(name).toString()); } } - } \ No newline at end of file diff --git a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java b/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java index 921624f63..77526c8d8 100644 --- a/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java +++ b/proxy/src/test/java/com/iluwatar/proxy/WizardTowerProxyTest.java @@ -31,9 +31,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** - * Date: 12/28/15 - 9:18 PM - * - * @author Jeroen Meulemeester + * Tests for {@link WizardTowerProxy} */ public class WizardTowerProxyTest { @@ -58,9 +56,9 @@ public class WizardTowerProxyTest { new Wizard("Merlin") }; - final WizardTowerProxy tower = new WizardTowerProxy(); - for (final Wizard wizard : wizards) { - tower.enter(wizard); + final WizardTowerProxy proxy = new WizardTowerProxy(new IvoryTower()); + for (Wizard wizard : wizards) { + proxy.enter(wizard); } assertTrue(appender.logContains("Gandalf enters the tower.")); @@ -69,5 +67,4 @@ public class WizardTowerProxyTest { assertTrue(appender.logContains("Merlin is not allowed to enter!")); assertEquals(4, appender.getLogSize()); } - }