import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * {@link <a href=
 * "https://[Log in to view URL]"
 * target= "_blank"></a>}
 * 
 * @author itammb ( Italia Massimiliano Buscati )
 * @version JDK 1.15
 *
 */
class Main {
	public static enum FLY_TYPE {
		HELICOPTER, AIRPLANE, HOT_AIR_BALLON
	}

	public static enum ACTION_TYPE {
		TAKEOFF, LANDING
	}

	interface Airplane {
		void takeOff();

		void landing();

		void waiting();
	}

	public static class AirComponent implements Airplane {
		private MediatorAirTrafficControlTower controlTower;
		private FLY_TYPE flyType;
		private String id;

		public AirComponent(FLY_TYPE flyType, String id) {
			this.flyType = flyType;
			this.id = id;
		}

		public void setControlTower(MediatorAirTrafficControlTower controlTower) {
			this.controlTower = controlTower;
		}

		@Override
		public void takeOff() {
			System.out.println(id + " -- " + flyType + " -- takeoff");
			controlTower.notifyAirTrafficControl(this, ACTION_TYPE.TAKEOFF);
		}

		@Override
		public void landing() {
			System.out.println(id + " -- " + flyType + " -- landing");
			controlTower.notifyAirTrafficControl(this, ACTION_TYPE.LANDING);
		}

		@Override
		public void waiting() {
			System.out.println(flyType + " -- waiting");
		}
	}

	public interface MediatorAirTrafficControlTower {
		public void notifyAirTrafficControl(AirComponent component, ACTION_TYPE event);
	}

	public static class MediatorConcreteAirportControlTower implements MediatorAirTrafficControlTower {
		private List<AirComponent> airComponents;

		public MediatorConcreteAirportControlTower(List<AirComponent> airComponents) {
			this.airComponents = airComponents;
		}

		@Override
		public void notifyAirTrafficControl(AirComponent sender, ACTION_TYPE event) {
			if (event.equals(ACTION_TYPE.LANDING))
				reactOnLanding(sender, event);
			else if (event.equals(ACTION_TYPE.TAKEOFF))
				reactOnTakeoff(sender, event);
		}

		private void reactOnLanding(AirComponent sender, ACTION_TYPE event) {
			react(sender, event);

			airComponents.remove(sender);
		}

		private void reactOnTakeoff(AirComponent sender, ACTION_TYPE event) {
			react(sender, event);

			airComponents.remove(sender);
		}

		private void react(AirComponent sender, ACTION_TYPE event) {
			System.out.println("request -- ok");

			for (AirComponent otherAction : airComponents)
				if (!otherAction.equals(sender))
					otherAction.waiting();
		}
	}

	public static void main(String args[]) {
		// Unit test - uso del design pattern: mediator

		List<AirComponent> airComponents = new ArrayList<AirComponent>();

		airComponents.add(new AirComponent(FLY_TYPE.HELICOPTER, "AIR XZ12"));
		airComponents.add(new AirComponent(FLY_TYPE.AIRPLANE, "AIR YH2"));
		airComponents.add(new AirComponent(FLY_TYPE.HOT_AIR_BALLON, "AIR KL1"));

		MediatorConcreteAirportControlTower controlTower = new MediatorConcreteAirportControlTower(airComponents);

		for (AirComponent airComponent : airComponents)
			airComponent.setControlTower(controlTower);

		while (!airComponents.isEmpty()) {
			if ((new Random().nextBoolean()))
				airComponents.get(0).landing();
			else
				airComponents.get(0).takeOff();
		}
	}
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: