diff --git a/proxy/README.md b/proxy/README.md index a3cdbf78..ca63a659 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 64c61f1f..300e58dd 100644 Binary files a/proxy/etc/proxy.png and b/proxy/etc/proxy.png differ diff --git a/proxy/etc/proxy.ucls b/proxy/etc/proxy.ucls index f3906b68..76b5f016 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 ba86fa8d..00000000 Binary files a/proxy/etc/proxy_1.png and /dev/null differ diff --git a/proxy/src/main/java/com/iluwatar/proxy/App.java b/proxy/src/main/java/com/iluwatar/proxy/App.java index 9c27cfb0..98e30442 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 @@ * 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 00000000..de89240f --- /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 5ea2e827..099ed54c 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 @@ */ 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 d5daab30..82397931 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 1048724d..d0563910 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 @@ /** * - * 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 ab56115c..9f884cde 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.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 void testEnter() throws Exception { 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 void testEnter() throws Exception { 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 56ad74c8..1187a89a 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 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 921624f6..77526c8d 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.assertTrue; /** - * Date: 12/28/15 - 9:18 PM - * - * @author Jeroen Meulemeester + * Tests for {@link WizardTowerProxy} */ public class WizardTowerProxyTest { @@ -58,9 +56,9 @@ public void testEnter() throws Exception { 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 void testEnter() throws Exception { assertTrue(appender.logContains("Merlin is not allowed to enter!")); assertEquals(4, appender.getLogSize()); } - }