Mediator Design Pattern example

In an airport, there are multiple airplanes that need to communicate and coordinate their movements to avoid collisions and ensure safe takeoffs and landings. Without a centralized system, direct communication between airplanes could lead to chaos and increased risk.

What can be the challenges while implementing this system?

  • Air Traffic Complexity: Direct communication between airplanes might result in complex and error-prone coordination, especially when dealing with multiple aircraft in the same airspace.
  • Collision Risks: Without a centralized control mechanism, the risk of collisions between airplanes during takeoffs, landings, or mid-flight maneuvers increases.

How Mediator Pattern help to solve above challenges?

The Mediator pattern helps in managing the complex communication and coordination between airplanes and air traffic controllers, ensuring a safer and more organized aviation system. The centralized control provided by the mediator simplifies interactions, reduces the risk of errors, and promotes a scalable and maintainable solution in the aviation domain.

  • Centralized Control: The air traffic control tower acts as a mediator, facilitating communication between airplanes. This ensures that all airplanes are aware of each other’s positions and intentions.
  • Collision Avoidance: The mediator (air traffic control tower) manages the flow of airplanes, preventing collisions by providing clear instructions and coordinating their movements.

Below is the code of above problem statement using Command Pattern:

1. Colleague Interface(Airplane)

Java




// Colleague Interface
public interface Airplane {
    void requestTakeoff();
    void requestLanding();
    void notifyAirTrafficControl(String message);
}


2. ConcreteColleague Class(CommercialAirplane)

Java




// Concrete Colleague
public class CommercialAirplane implements Airplane {
    private AirTrafficControlTower mediator;
 
    public CommercialAirplane(AirTrafficControlTower mediator) {
        this.mediator = mediator;
    }
 
    @Override
    public void requestTakeoff() {
        mediator.requestTakeoff(this);
    }
 
    @Override
    public void requestLanding() {
        mediator.requestLanding(this);
    }
 
    @Override
    public void notifyAirTrafficControl(String message) {
        System.out.println("Commercial Airplane: " + message);
    }
}


3. Mediator Interface(AirTrafficControlTower)

Java




// Mediator Interface
public interface AirTrafficControlTower {
    void requestTakeoff(Airplane airplane);
    void requestLanding(Airplane airplane);
}


4. ConcreteMediator Class(AirportControlTower)

Java




// Concrete Mediator
public class AirportControlTower implements AirTrafficControlTower {
    @Override
    public void requestTakeoff(Airplane airplane) {
        // Logic for coordinating takeoff
        airplane.notifyAirTrafficControl("Requesting takeoff clearance.");
    }
 
    @Override
    public void requestLanding(Airplane airplane) {
        // Logic for coordinating landing
        airplane.notifyAirTrafficControl("Requesting landing clearance.");
    }
}


Complete code for the above example

Below is the complete code for the above example:

Java




// Colleague Interface
interface Airplane {
    void requestTakeoff();
    void requestLanding();
    void notifyAirTrafficControl(String message);
}
 
// Concrete Colleague
class CommercialAirplane implements Airplane {
    private AirTrafficControlTower mediator;
 
    public CommercialAirplane(AirTrafficControlTower mediator) {
        this.mediator = mediator;
    }
 
    @Override
    public void requestTakeoff() {
        mediator.requestTakeoff(this);
    }
 
    @Override
    public void requestLanding() {
        mediator.requestLanding(this);
    }
 
    @Override
    public void notifyAirTrafficControl(String message) {
        System.out.println("Commercial Airplane: " + message);
    }
}
 
// Mediator Interface
interface AirTrafficControlTower {
    void requestTakeoff(Airplane airplane);
    void requestLanding(Airplane airplane);
}
 
// Concrete Mediator
class AirportControlTower implements AirTrafficControlTower {
    @Override
    public void requestTakeoff(Airplane airplane) {
        // Logic for coordinating takeoff
        airplane.notifyAirTrafficControl("Requesting takeoff clearance.");
    }
 
    @Override
    public void requestLanding(Airplane airplane) {
        // Logic for coordinating landing
        airplane.notifyAirTrafficControl("Requesting landing clearance.");
    }
}
 
// Main class
public class MediatorAirplaneExample {
    public static void main(String[] args) {
        // Instantiate the Mediator (Airport Control Tower)
        AirTrafficControlTower controlTower = new AirportControlTower();
 
        // Instantiate Concrete Colleagues (Commercial Airplanes)
        Airplane airplane1 = new CommercialAirplane(controlTower);
        Airplane airplane2 = new CommercialAirplane(controlTower);
 
        // Set up the association between Concrete Colleagues and the Mediator
        airplane1.requestTakeoff();
        airplane2.requestLanding();
 
        // Output:
        // Commercial Airplane: Requesting takeoff clearance.
        // Commercial Airplane: Requesting landing clearance.
    }
}


Output




Commercial Airplane: Requesting takeoff clearance.
Commercial Airplane: Requesting landing clearance.


Mediator design pattern

The Mediator design pattern is a behavioral pattern that defines an object, the mediator, to centralize communication between various components or objects in a system. This promotes loose coupling by preventing direct interactions between components, instead of having them communicate through the mediator, facilitating better maintainability and flexibility in the system architecture.

Important Topics for the Mediator Design Pattern

  • What is the Mediator Design Pattern?
  • Real-Life Analogy of the Mediator Design Pattern
  • Components of the Mediator Design Pattern
  • How components are interacting with each other?
  • Mediator Design Pattern example
  • When to use the Mediator Design Pattern
  • When not to use the Mediator Design Pattern

Similar Reads

What is the Mediator Design Pattern?

A mediator design pattern is one of the important and widely used behavioral design patterns. Mediator enables the decoupling of objects by introducing a layer in between so that the interaction between objects happens via the layer. Real Life...

Real-Life Analogy of the Mediator Design Pattern

Let’s imagine a group project in a classroom:...

Components of the Mediator Design Pattern

1. Mediator...

How components are interacting with each other ?

...

Mediator Design Pattern example

In an airport, there are multiple airplanes that need to communicate and coordinate their movements to avoid collisions and ensure safe takeoffs and landings. Without a centralized system, direct communication between airplanes could lead to chaos and increased risk....

When to use the Mediator Design Pattern

...

When not to use the Mediator Design Pattern

...