Commented the code.
This commit is contained in:
		| @@ -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<GameObject> 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(""); | ||||
|     } | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -3,6 +3,11 @@ package com.iluwatar; | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
|  | ||||
| /** | ||||
|  *  | ||||
|  * Unit test for Rectangle | ||||
|  * | ||||
|  */ | ||||
| public class RectangleTest { | ||||
|  | ||||
| 	@Test | ||||
|   | ||||
		Reference in New Issue
	
	Block a user