diff --git a/double-dispatch/src/main/java/com/iluwatar/App.java b/double-dispatch/src/main/java/com/iluwatar/App.java index 81fbe7796..c95ca8a21 100644 --- a/double-dispatch/src/main/java/com/iluwatar/App.java +++ b/double-dispatch/src/main/java/com/iluwatar/App.java @@ -3,21 +3,43 @@ package com.iluwatar; import java.util.ArrayList; import java.util.List; +/** + * + * When a message with a parameter is sent to an object, the resultant behaviour is defined by the + * implementation of that method in the receiver. Sometimes the behaviour must also be determined + * by the type of the parameter. + * + * One way to implement this would be to create multiple instanceof-checks for the methods parameter. + * However, this creates a maintenance issue. When new types are added we would also need to change + * the method's implementation and add a new instanceof-check. This violates the single responsibility + * principle - a class should have only one reason to change. + * + * Instead of the instanceof-checks a better way is to make another virtual call on the parameter + * object. This way new functionality can be easily added without the need to modify existing + * implementation (open-closed principle). + * + * In this example we have hierarchy of objects (GameObject) that can collide to each other. Each + * object has its own coordinates which are checked against the other objects' coordinates. If + * there is an overlap, then the objects collide utilizing the Double Dispatch pattern. + * + */ public class App { public static void main( String[] args ) { + // initialize game objects and print their status List objects = new ArrayList<>(); objects.add(new FlamingAsteroid(0, 0, 5, 5)); objects.add(new SpaceStationMir(1, 1, 2, 2)); objects.add(new Meteoroid(10, 10, 15, 15)); objects.add(new SpaceStationIss(12, 12, 14, 14)); - objects.stream().forEach(o -> System.out.println(o)); System.out.println(""); + // collision check objects.stream().forEach(o1 -> objects.stream().forEach(o2 -> { if (o1 != o2 && o1.intersectsWith(o2)) o1.collision(o2); } )); System.out.println(""); + // output eventual object statuses objects.stream().forEach(o -> System.out.println(o)); System.out.println(""); } diff --git a/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java b/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java index a5bcf29d2..755e8f7c3 100644 --- a/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java +++ b/double-dispatch/src/main/java/com/iluwatar/FlamingAsteroid.java @@ -1,5 +1,10 @@ package com.iluwatar; +/** + * + * Flaming asteroid game object + * + */ public class FlamingAsteroid extends Meteoroid { public FlamingAsteroid(int left, int top, int right, int bottom) { diff --git a/double-dispatch/src/main/java/com/iluwatar/GameObject.java b/double-dispatch/src/main/java/com/iluwatar/GameObject.java index 9bcc77a25..f6b77fb59 100644 --- a/double-dispatch/src/main/java/com/iluwatar/GameObject.java +++ b/double-dispatch/src/main/java/com/iluwatar/GameObject.java @@ -1,5 +1,11 @@ package com.iluwatar; +/** + * + * Game objects have coordinates and some + * other status information. + * + */ public abstract class GameObject extends Rectangle { private boolean damaged; diff --git a/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java b/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java index a9be52387..4ce55308c 100644 --- a/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java +++ b/double-dispatch/src/main/java/com/iluwatar/Meteoroid.java @@ -1,5 +1,10 @@ package com.iluwatar; +/** + * + * Meteoroid game object + * + */ public class Meteoroid extends GameObject { public Meteoroid(int left, int top, int right, int bottom) { diff --git a/double-dispatch/src/main/java/com/iluwatar/Rectangle.java b/double-dispatch/src/main/java/com/iluwatar/Rectangle.java index d4c5f44d1..86fef6d21 100644 --- a/double-dispatch/src/main/java/com/iluwatar/Rectangle.java +++ b/double-dispatch/src/main/java/com/iluwatar/Rectangle.java @@ -1,5 +1,11 @@ package com.iluwatar; +/** + * + * Rectangle has coordinates and can be checked for overlap against + * other Rectangles. + * + */ public class Rectangle { private int left; diff --git a/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java b/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java index 6fe70792d..f655fad03 100644 --- a/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java +++ b/double-dispatch/src/main/java/com/iluwatar/SpaceStationIss.java @@ -1,5 +1,10 @@ package com.iluwatar; +/** + * + * Space station ISS game object + * + */ public class SpaceStationIss extends SpaceStationMir { public SpaceStationIss(int left, int top, int right, int bottom) { diff --git a/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java b/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java index 366e73933..0a020a434 100644 --- a/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java +++ b/double-dispatch/src/main/java/com/iluwatar/SpaceStationMir.java @@ -1,5 +1,10 @@ package com.iluwatar; +/** + * + * Space station Mir game object + * + */ public class SpaceStationMir extends GameObject { public SpaceStationMir(int left, int top, int right, int bottom) { diff --git a/double-dispatch/src/test/java/com/iluwatar/RectangleTest.java b/double-dispatch/src/test/java/com/iluwatar/RectangleTest.java index 88d940220..886bc7130 100644 --- a/double-dispatch/src/test/java/com/iluwatar/RectangleTest.java +++ b/double-dispatch/src/test/java/com/iluwatar/RectangleTest.java @@ -3,6 +3,11 @@ package com.iluwatar; import org.junit.Assert; import org.junit.Test; +/** + * + * Unit test for Rectangle + * + */ public class RectangleTest { @Test