From 119d2647798dd78efc52ed7f4f388ed445d2115b Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Tue, 1 Dec 2015 16:00:31 +0900 Subject: [PATCH 1/3] issue #292 --- adapter/etc/adapter.png | Bin 11970 -> 12086 bytes adapter/etc/adapter.ucls | 78 ++++++------- adapter/etc/adapter_1.png | Bin 29974 -> 0 bytes adapter/index.md | 2 +- .../main/java/com/iluwatar/adapter/App.java | 53 +++++---- .../java/com/iluwatar/adapter/Engineer.java | 11 -- .../com/iluwatar/adapter/GnomeEngineer.java | 23 ---- .../adapter/GnomeEngineeringManager.java | 26 ----- .../com/iluwatar/adapter/GoblinGlider.java | 21 ---- .../iluwatar/adapter/AdapterPatternTest.java | 107 +++++++++++------- 10 files changed, 139 insertions(+), 182 deletions(-) delete mode 100644 adapter/etc/adapter_1.png delete mode 100644 adapter/src/main/java/com/iluwatar/adapter/Engineer.java delete mode 100644 adapter/src/main/java/com/iluwatar/adapter/GnomeEngineer.java delete mode 100644 adapter/src/main/java/com/iluwatar/adapter/GnomeEngineeringManager.java delete mode 100644 adapter/src/main/java/com/iluwatar/adapter/GoblinGlider.java diff --git a/adapter/etc/adapter.png b/adapter/etc/adapter.png index 511bb5880ee7a3dff0ce29bed65b15cb484f310a..f43358b042e73edcbcb9589e540a8d306fa1d6c1 100644 GIT binary patch literal 12086 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 literal 11970 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 P(@{PE72lUh82J4!|7lHV diff --git a/adapter/etc/adapter.ucls b/adapter/etc/adapter.ucls index 8c09f0399..290ff544e 100644 --- a/adapter/etc/adapter.ucls +++ b/adapter/etc/adapter.ucls @@ -1,61 +1,61 @@ - - - + + + - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + - - - - - - - - + + + + - + + + + + - - + + diff --git a/adapter/etc/adapter_1.png b/adapter/etc/adapter_1.png deleted file mode 100644 index 64eb34b84f799f7834e2517bf2e60decbef3ae8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29974 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 diff --git a/adapter/index.md b/adapter/index.md index 36a2a0ad3..7c7dc15e5 100644 --- a/adapter/index.md +++ b/adapter/index.md @@ -15,7 +15,7 @@ tags: expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. -![alt text](./etc/adapter_1.png "Adapter") +![alt text](./etc/adapter.png "Adapter") **Applicability:** Use the Adapter pattern when diff --git a/adapter/src/main/java/com/iluwatar/adapter/App.java b/adapter/src/main/java/com/iluwatar/adapter/App.java index d2353eec4..c33780198 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/App.java +++ b/adapter/src/main/java/com/iluwatar/adapter/App.java @@ -1,28 +1,43 @@ package com.iluwatar.adapter; /** - * An adapter helps two incompatible interfaces to work together. This is the real world definition - * for an adapter. Interfaces may be incompatible but the inner functionality should suit the need. - * The Adapter design pattern allows otherwise incompatible classes to work together by converting - * the interface of one class into an interface expected by the clients. + * An adapter helps two incompatible interfaces to work together. This is the + * real world definition for an adapter. Interfaces may be incompatible but the + * inner functionality should suit the need. The Adapter design pattern allows + * otherwise incompatible classes to work together by converting the interface + * of one class into an interface expected by the clients. * - *

There are two variations of the Adapter pattern: The class adapter implements the adaptee's - * interface whereas the object adapter uses composition to contain the adaptee in the adapter - * object. This example uses the object adapter approach. + *

+ * There are two variations of the Adapter pattern: The class adapter implements + * the adaptee's interface whereas the object adapter uses composition to + * contain the adaptee in the adapter object. This example uses the object + * adapter approach. + * + *

+ * The Adapter ({@link BattleFishingBoat}) converts the interface of the adaptee + * class ( {@link FishingBoat}) into a suitable one expected by the client ( + * {@link BattleShip} ). + * + *

+ * The story of this implementation is this.
+ * Pirates are coming! we need a {@link BattleShip} to fight! We have a + * {@link FishingBoat} and our captain. We have no time to make up a new ship! + * we need to reuse this {@link FishingBoat}. The captain needs a battleship + * which can fire and move. The spec is in {@link BattleShip}. We will use the + * Adapter pattern to reuse {@link FishingBoat}. * - *

The Adapter ({@link GnomeEngineer}) converts the interface of the target class ( - * {@link GoblinGlider}) into a suitable one expected by the client ({@link GnomeEngineeringManager} - * ). */ public class App { - /** - * Program entry point. - * - * @param args command line args - */ - public static void main(String[] args) { - Engineer manager = new GnomeEngineeringManager(new GnomeEngineer()); - manager.operateDevice(); - } + /** + * Program entry point. + * + * @param args + * command line args + */ + public static void main(String[] args) { + Captain captain = new Captain(new BattleFishingBoat()); + captain.move(); + captain.fire(); + } } diff --git a/adapter/src/main/java/com/iluwatar/adapter/Engineer.java b/adapter/src/main/java/com/iluwatar/adapter/Engineer.java deleted file mode 100644 index a973cb530..000000000 --- a/adapter/src/main/java/com/iluwatar/adapter/Engineer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iluwatar.adapter; - -/** - * - * Engineers can operate devices. - * - */ -public interface Engineer { - - void operateDevice(); -} diff --git a/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineer.java b/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineer.java deleted file mode 100644 index 70e166ac3..000000000 --- a/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineer.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iluwatar.adapter; - -/** - * - * Adapter class. Adapts the interface of the device ({@link GoblinGlider}) into {@link Engineer} - * interface expected by the client ({@link GnomeEngineeringManager}). - * - */ -public class GnomeEngineer implements Engineer { - - private GoblinGlider glider; - - public GnomeEngineer() { - glider = new GoblinGlider(); - } - - @Override - public void operateDevice() { - glider.attachGlider(); - glider.gainSpeed(); - glider.takeOff(); - } -} diff --git a/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineeringManager.java b/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineeringManager.java deleted file mode 100644 index ff4ddb617..000000000 --- a/adapter/src/main/java/com/iluwatar/adapter/GnomeEngineeringManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.iluwatar.adapter; - -/** - * GnomeEngineering manager uses {@link Engineer} to operate devices. - */ -public class GnomeEngineeringManager implements Engineer { - - private Engineer engineer; - - public GnomeEngineeringManager() { - - } - - public GnomeEngineeringManager(Engineer engineer) { - this.engineer = engineer; - } - - @Override - public void operateDevice() { - engineer.operateDevice(); - } - - public void setEngineer(Engineer engineer) { - this.engineer = engineer; - } -} diff --git a/adapter/src/main/java/com/iluwatar/adapter/GoblinGlider.java b/adapter/src/main/java/com/iluwatar/adapter/GoblinGlider.java deleted file mode 100644 index 79a9acef6..000000000 --- a/adapter/src/main/java/com/iluwatar/adapter/GoblinGlider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iluwatar.adapter; - -/** - * - * Device class (adaptee in the pattern). - * - */ -public class GoblinGlider { - - public void attachGlider() { - System.out.println("Glider attached."); - } - - public void gainSpeed() { - System.out.println("Gaining speed."); - } - - public void takeOff() { - System.out.println("Lift-off!"); - } -} diff --git a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java index 866bfb968..c9a1a9bca 100644 --- a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java +++ b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java @@ -9,60 +9,83 @@ import java.util.Map; import org.junit.Before; import org.junit.Test; +import com.iluwatar.adapter.BattleFishingBoat; +import com.iluwatar.adapter.BattleShip; +import com.iluwatar.adapter.Captain; +import com.iluwatar.adapter.FishingBoat; + /** - * An adapter helps two incompatible interfaces to work together. This is the real world definition - * for an adapter. Interfaces may be incompatible but the inner functionality should suit the need. - * The Adapter design pattern allows otherwise incompatible classes to work together by converting - * the interface of one class into an interface expected by the clients. + * An adapter helps two incompatible interfaces to work together. This is the + * real world definition for an adapter. Interfaces may be incompatible but the + * inner functionality should suit the need. The Adapter design pattern allows + * otherwise incompatible classes to work together by converting the interface + * of one class into an interface expected by the clients. * - *

There are two variations of the Adapter pattern: - * The class adapter implements the adaptee's - * interface whereas the object adapter uses composition to contain the adaptee in the adapter - * object. This example uses the object adapter approach. + *

+ * There are two variations of the Adapter pattern: The class adapter implements + * the adaptee's interface whereas the object adapter uses composition to + * contain the adaptee in the adapter object. This example uses the object + * adapter approach. + * + *

+ * The Adapter ({@link BattleFishingBoat}) converts the interface of the adaptee + * class ( {@link FishingBoat}) into a suitable one expected by the client ( + * {@link BattleShip} ). + * + *

+ * The story of this implementation is this.
+ * Pirates are coming! we need a {@link BattleShip} to fight! We have a + * {@link FishingBoat} and our captain. We have no time to make up a new ship! + * we need to reuse this {@link FishingBoat}. The captain needs a battleship + * which can fire and move. The spec is in {@link BattleShip}. We will use the + * Adapter pattern to reuse {@link FishingBoat} which operates properly * - *

The Adapter ({@link GnomeEngineer}) converts the interface - * of the target class ({@link GoblinGlider}) into a suitable one expected by - * the client ({@link GnomeEngineeringManager} - * ). */ public class AdapterPatternTest { - private Map beans; + private Map beans; - private static final String ENGINEER_BEAN = "engineer"; + private static final String BATTLESHIP_BEAN = "engineer"; - private static final String MANAGER_BEAN = "manager"; + private static final String CAPTAIN_BEAN = "captain"; - /** - * This method runs before the test execution and sets the bean objects in the beans Map. - */ - @Before - public void setup() { - beans = new HashMap<>(); + /** + * This method runs before the test execution and sets the bean objects in + * the beans Map. + */ + @Before + public void setup() { + beans = new HashMap<>(); - GnomeEngineer gnomeEngineer = spy(new GnomeEngineer()); - beans.put(ENGINEER_BEAN, gnomeEngineer); + BattleFishingBoat battleFishingBoat = spy(new BattleFishingBoat()); + beans.put(BATTLESHIP_BEAN, battleFishingBoat); - GnomeEngineeringManager manager = new GnomeEngineeringManager(); - manager.setEngineer((GnomeEngineer) beans.get(ENGINEER_BEAN)); - beans.put(MANAGER_BEAN, manager); - } + Captain captain = new Captain(); + captain.setBattleship((BattleFishingBoat) beans.get(BATTLESHIP_BEAN)); + beans.put(CAPTAIN_BEAN, captain); + } - /** - * This test asserts that when we call operateDevice() method on a manager bean, it is internally - * calling operateDevice method on the engineer object. The Adapter ({@link GnomeEngineer}) - * converts the interface of the target class ( {@link GoblinGlider}) into a suitable one expected - * by the client ({@link GnomeEngineeringManager} ). - */ - @Test - public void testAdapter() { - Engineer manager = (Engineer) beans.get(MANAGER_BEAN); + /** + * This test asserts that when we use the move() method on a captain + * bean(client), it is internally calling move method on the battleship + * object. The Adapter ({@link BattleFishingBoat}) converts the interface of + * the target class ( {@link FishingBoat}) into a suitable one expected by + * the client ({@link Captain} ). + */ + @Test + public void testAdapter() { + BattleShip captain = (BattleShip) beans.get(CAPTAIN_BEAN); - // when manager is asked to operate device - manager.operateDevice(); + // when captain moves + captain.move(); - // Manager internally calls the engineer object to operateDevice - Engineer engineer = (Engineer) beans.get(ENGINEER_BEAN); - verify(engineer).operateDevice(); - } + // the captain internally calls the battleship object to move + BattleShip battleship = (BattleShip) beans.get(BATTLESHIP_BEAN); + verify(battleship).move(); + + // same with above with firing + captain.fire(); + verify(battleship).fire(); + + } } From 33b41f872e0d7023a8f2ccd6cf21b85cd2f9f27f Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Wed, 2 Dec 2015 18:45:08 +0900 Subject: [PATCH 2/3] The new java files was not added.. #292 --- .../iluwatar/adapter/BattleFishingBoat.java | 29 ++++++++++++++++ .../java/com/iluwatar/adapter/BattleShip.java | 14 ++++++++ .../java/com/iluwatar/adapter/Captain.java | 33 +++++++++++++++++++ .../com/iluwatar/adapter/FishingBoat.java | 18 ++++++++++ 4 files changed, 94 insertions(+) create mode 100644 adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java create mode 100644 adapter/src/main/java/com/iluwatar/adapter/BattleShip.java create mode 100644 adapter/src/main/java/com/iluwatar/adapter/Captain.java create mode 100644 adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java diff --git a/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java b/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java new file mode 100644 index 000000000..ffd73de3a --- /dev/null +++ b/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java @@ -0,0 +1,29 @@ +package com.iluwatar.adapter; + +/** + * + * Adapter class. Adapts the interface of the device ({@link FishingBoat}) into {@link BattleShip} + * interface expected by the client ({@link Captain}).
+ * In this case we added a new function fire to suit the interface. We are reusing the + * {@link FishingBoat} without changing itself. The Adapter class can just map the functions of the + * Adaptee or add, delete features of the Adaptee. + * + */ +public class BattleFishingBoat implements BattleShip { + + private FishingBoat boat; + + public BattleFishingBoat() { + boat = new FishingBoat(); + } + + @Override + public void fire() { + System.out.println("fire!"); + } + + @Override + public void move() { + boat.sail(); + } +} diff --git a/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java b/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java new file mode 100644 index 000000000..90b18f758 --- /dev/null +++ b/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java @@ -0,0 +1,14 @@ +package com.iluwatar.adapter; + +/** + * The interface expected by the client.
+ * A Battleship can fire and move. + * + */ +public interface BattleShip { + + void fire(); + + void move(); + +} diff --git a/adapter/src/main/java/com/iluwatar/adapter/Captain.java b/adapter/src/main/java/com/iluwatar/adapter/Captain.java new file mode 100644 index 000000000..8c48daf69 --- /dev/null +++ b/adapter/src/main/java/com/iluwatar/adapter/Captain.java @@ -0,0 +1,33 @@ +package com.iluwatar.adapter; + +/** + * The Captain uses {@link BattleShip} to fight.
+ * This is the client in the pattern. + */ +public class Captain implements BattleShip { + + private BattleShip battleship; + + public Captain() { + + } + + public Captain(BattleShip battleship) { + this.battleship = battleship; + } + + public void setBattleship(BattleShip battleship) { + this.battleship = battleship; + } + + @Override + public void fire() { + battleship.fire(); + } + + @Override + public void move() { + battleship.move(); + } + +} diff --git a/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java b/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java new file mode 100644 index 000000000..d2f9dae25 --- /dev/null +++ b/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java @@ -0,0 +1,18 @@ +package com.iluwatar.adapter; + +/** + * + * Device class (adaptee in the pattern). We want to reuse this class + * + */ +public class FishingBoat { + + public void sail() { + System.out.println("The Boat is moving to that place"); + } + + public void fish() { + System.out.println("fishing ..."); + } + +} From e2d8079b36f670de04d5901ed576cc9fe9ea6a3d Mon Sep 17 00:00:00 2001 From: JuhoKang Date: Mon, 7 Dec 2015 10:35:32 +0900 Subject: [PATCH 3/3] Fixed code to follow coding conventions --- .../main/java/com/iluwatar/adapter/App.java | 59 ++++++------ .../iluwatar/adapter/BattleFishingBoat.java | 4 +- .../java/com/iluwatar/adapter/BattleShip.java | 2 +- .../com/iluwatar/adapter/FishingBoat.java | 4 +- .../iluwatar/adapter/AdapterPatternTest.java | 93 +++++++------------ 5 files changed, 66 insertions(+), 96 deletions(-) diff --git a/adapter/src/main/java/com/iluwatar/adapter/App.java b/adapter/src/main/java/com/iluwatar/adapter/App.java index c33780198..d57cb91e4 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/App.java +++ b/adapter/src/main/java/com/iluwatar/adapter/App.java @@ -1,43 +1,38 @@ package com.iluwatar.adapter; /** - * An adapter helps two incompatible interfaces to work together. This is the - * real world definition for an adapter. Interfaces may be incompatible but the - * inner functionality should suit the need. The Adapter design pattern allows - * otherwise incompatible classes to work together by converting the interface - * of one class into an interface expected by the clients. - * + * An adapter helps two incompatible interfaces to work together. This is the real world definition + * for an adapter. Interfaces may be incompatible but the inner functionality should suit the need. + * The Adapter design pattern allows otherwise incompatible classes to work together by converting + * the interface of one class into an interface expected by the clients. + * *

- * There are two variations of the Adapter pattern: The class adapter implements - * the adaptee's interface whereas the object adapter uses composition to - * contain the adaptee in the adapter object. This example uses the object - * adapter approach. - * + * There are two variations of the Adapter pattern: The class adapter implements the adaptee's + * interface whereas the object adapter uses composition to contain the adaptee in the adapter + * object. This example uses the object adapter approach. + * *

- * The Adapter ({@link BattleFishingBoat}) converts the interface of the adaptee - * class ( {@link FishingBoat}) into a suitable one expected by the client ( - * {@link BattleShip} ). - * + * The Adapter ({@link BattleFishingBoat}) converts the interface of the adaptee class ( + * {@link FishingBoat}) into a suitable one expected by the client ( {@link BattleShip} ). + * *

* The story of this implementation is this.
- * Pirates are coming! we need a {@link BattleShip} to fight! We have a - * {@link FishingBoat} and our captain. We have no time to make up a new ship! - * we need to reuse this {@link FishingBoat}. The captain needs a battleship - * which can fire and move. The spec is in {@link BattleShip}. We will use the - * Adapter pattern to reuse {@link FishingBoat}. - * + * Pirates are coming! we need a {@link BattleShip} to fight! We have a {@link FishingBoat} and our + * captain. We have no time to make up a new ship! we need to reuse this {@link FishingBoat}. The + * captain needs a battleship which can fire and move. The spec is in {@link BattleShip}. We will + * use the Adapter pattern to reuse {@link FishingBoat}. + * */ public class App { - /** - * Program entry point. - * - * @param args - * command line args - */ - public static void main(String[] args) { - Captain captain = new Captain(new BattleFishingBoat()); - captain.move(); - captain.fire(); - } + /** + * Program entry point. + * + * @param args command line args + */ + public static void main(String[] args) { + Captain captain = new Captain(new BattleFishingBoat()); + captain.move(); + captain.fire(); + } } diff --git a/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java b/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java index ffd73de3a..3f573337f 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java +++ b/adapter/src/main/java/com/iluwatar/adapter/BattleFishingBoat.java @@ -1,13 +1,13 @@ package com.iluwatar.adapter; /** - * + * * Adapter class. Adapts the interface of the device ({@link FishingBoat}) into {@link BattleShip} * interface expected by the client ({@link Captain}).
* In this case we added a new function fire to suit the interface. We are reusing the * {@link FishingBoat} without changing itself. The Adapter class can just map the functions of the * Adaptee or add, delete features of the Adaptee. - * + * */ public class BattleFishingBoat implements BattleShip { diff --git a/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java b/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java index 90b18f758..d4f6036e6 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java +++ b/adapter/src/main/java/com/iluwatar/adapter/BattleShip.java @@ -3,7 +3,7 @@ package com.iluwatar.adapter; /** * The interface expected by the client.
* A Battleship can fire and move. - * + * */ public interface BattleShip { diff --git a/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java b/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java index d2f9dae25..509bb8cdb 100644 --- a/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java +++ b/adapter/src/main/java/com/iluwatar/adapter/FishingBoat.java @@ -1,9 +1,9 @@ package com.iluwatar.adapter; /** - * + * * Device class (adaptee in the pattern). We want to reuse this class - * + * */ public class FishingBoat { diff --git a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java index c9a1a9bca..98c7cee2d 100644 --- a/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java +++ b/adapter/src/test/java/com/iluwatar/adapter/AdapterPatternTest.java @@ -15,77 +15,52 @@ import com.iluwatar.adapter.Captain; import com.iluwatar.adapter.FishingBoat; /** - * An adapter helps two incompatible interfaces to work together. This is the - * real world definition for an adapter. Interfaces may be incompatible but the - * inner functionality should suit the need. The Adapter design pattern allows - * otherwise incompatible classes to work together by converting the interface - * of one class into an interface expected by the clients. - * - *

- * There are two variations of the Adapter pattern: The class adapter implements - * the adaptee's interface whereas the object adapter uses composition to - * contain the adaptee in the adapter object. This example uses the object - * adapter approach. - * - *

- * The Adapter ({@link BattleFishingBoat}) converts the interface of the adaptee - * class ( {@link FishingBoat}) into a suitable one expected by the client ( - * {@link BattleShip} ). - * - *

- * The story of this implementation is this.
- * Pirates are coming! we need a {@link BattleShip} to fight! We have a - * {@link FishingBoat} and our captain. We have no time to make up a new ship! - * we need to reuse this {@link FishingBoat}. The captain needs a battleship - * which can fire and move. The spec is in {@link BattleShip}. We will use the - * Adapter pattern to reuse {@link FishingBoat} which operates properly + * Test class * */ public class AdapterPatternTest { - private Map beans; + private Map beans; - private static final String BATTLESHIP_BEAN = "engineer"; + private static final String BATTLESHIP_BEAN = "engineer"; - private static final String CAPTAIN_BEAN = "captain"; + private static final String CAPTAIN_BEAN = "captain"; - /** - * This method runs before the test execution and sets the bean objects in - * the beans Map. - */ - @Before - public void setup() { - beans = new HashMap<>(); + /** + * This method runs before the test execution and sets the bean objects in the beans Map. + */ + @Before + public void setup() { + beans = new HashMap<>(); - BattleFishingBoat battleFishingBoat = spy(new BattleFishingBoat()); - beans.put(BATTLESHIP_BEAN, battleFishingBoat); + BattleFishingBoat battleFishingBoat = spy(new BattleFishingBoat()); + beans.put(BATTLESHIP_BEAN, battleFishingBoat); - Captain captain = new Captain(); - captain.setBattleship((BattleFishingBoat) beans.get(BATTLESHIP_BEAN)); - beans.put(CAPTAIN_BEAN, captain); - } + Captain captain = new Captain(); + captain.setBattleship((BattleFishingBoat) beans.get(BATTLESHIP_BEAN)); + beans.put(CAPTAIN_BEAN, captain); + } - /** - * This test asserts that when we use the move() method on a captain - * bean(client), it is internally calling move method on the battleship - * object. The Adapter ({@link BattleFishingBoat}) converts the interface of - * the target class ( {@link FishingBoat}) into a suitable one expected by - * the client ({@link Captain} ). - */ - @Test - public void testAdapter() { - BattleShip captain = (BattleShip) beans.get(CAPTAIN_BEAN); + /** + * This test asserts that when we use the move() method on a captain bean(client), it is + * internally calling move method on the battleship object. The Adapter ({@link BattleFishingBoat} + * ) converts the interface of the target class ( {@link FishingBoat}) into a suitable one + * expected by the client ({@link Captain} ). + */ + @Test + public void testAdapter() { + BattleShip captain = (BattleShip) beans.get(CAPTAIN_BEAN); - // when captain moves - captain.move(); + // when captain moves + captain.move(); - // the captain internally calls the battleship object to move - BattleShip battleship = (BattleShip) beans.get(BATTLESHIP_BEAN); - verify(battleship).move(); + // the captain internally calls the battleship object to move + BattleShip battleship = (BattleShip) beans.get(BATTLESHIP_BEAN); + verify(battleship).move(); - // same with above with firing - captain.fire(); - verify(battleship).fire(); + // same with above with firing + captain.fire(); + verify(battleship).fire(); - } + } }