Design Pattern: Adapter Pattern in Java

Adapter pattern is used when an interface does not match the new requirement and the existing interface needs to adapt to another interface.

Check complete details and explanations about the Adapter pattern in the article: Adapter Design Pattern

This article demonstrates Adapter pattern implementations in Java. Check the following examples.

Example #1: Transport

Existing Situation:

In the existing code, we already have classes named Plane and Helicopter. Both these classes implement an interface named AirTransport.

New requirement:

Then sometime later we are trying to add a feature for a transport system. So we have created an interface named Transport and all the transport related classes will implement the Transport interface.

Problem:

The AirTransport interface and its implementations do not match with the new Transport interface. And we don’t want to change the existing interface(AirTransport) and its implementations (Plane and Helicopter)

Solution:

  • Create a new class named AirTransportAdapter.
  • Import Transport interface in AirTransportAdapter.
  • Implement all required functions, and make any required changes to achieve the final result.
  • While using the new adapter class, pass the object in the constructor.

Class Diagram:

Take a look at the class diagram.

AirTransport Interface

package com.bigboxcode;

public interface AirTransport {
    int getNumberOfWheels();

    int getNumberOfEngines();

    double getWeight();

    // In Nautical miles
    double getDistanceTravelled();

    double getTravelCostTotal();

}

Plane Class [implements AirTransport]

package com.bigboxcode;

public class Plane  implements AirTransport {
    @Override
    public int getNumberOfWheels() {
        return 3;
    }

    @Override
    public int getNumberOfEngines() {
        return 2;
    }

    // get weight in pound
    @Override
    public double getWeight() {
        return 127_000;
    }

    // In Nautical miles
    @Override
    public double getDistanceTravelled() {
        return 500; // Nautical files
    }

    @Override
    public double getTravelCostTotal() {
        return 3_000;
    }
}

Helicopter Class [implements AirTransport]

package com.bigboxcode;

public class Helicopter implements AirTransport {
    @Override
    public int getNumberOfWheels() {
        return 0;
    }

    @Override
    public int getNumberOfEngines() {
        return 1;
    }

    // Get weight in LB
    @Override
    public double getWeight() {
        return 12_000;
    }

    // In Nautical miles
    @Override
    public double getDistanceTravelled() {
        return 180; // nautical miles
    }

    @Override
    public double getTravelCostTotal() {
        return 20_000;
    }
}

Transport Interface

package com.bigboxcode;

public interface Transport {
    int getNumberOfWheels();

    double getWeight();

    // In miles
    double getDistanceTravelled();

    double getTravelCostPerMile();
}

Bus Class [implements Transport]

package com.bigboxcode;

public class Bus implements Transport{
    @Override
    public int getNumberOfWheels() {
        return 4;
    }

    @Override
    public double getWeight() {
        return 10_000;
    }

    @Override
    public double getDistanceTravelled() {
        return 1_000;
    }

    @Override
    public double getTravelCostPerMile() {
        return 5;
    }
}

Bike Class [implements Transport]

package com.bigboxcode;

public class Bike implements Transport{
    @Override
    public int getNumberOfWheels() {
        return 2;
    }

    @Override
    public double getWeight() {
        return 700;
    }

    @Override
    public double getDistanceTravelled() {
        return 80;
    }

    @Override
    public double getTravelCostPerMile() {
        return 4;
    }
}

AirTransportAdapter Class [implements Transport]

package com.bigboxcode;

public class AirTransportAdapter implements Transport {
    private final AirTransport airTransport;

    public AirTransportAdapter(AirTransport airTransport) {
        this.airTransport = airTransport;
    }

    @Override
    public int getNumberOfWheels() {
        return this.airTransport.getNumberOfWheels();
    }

    @Override
    public double getWeight() {
        return this.airTransport.getWeight();
    }

    @Override
    public double getDistanceTravelled() {
        // Convert nautical mile to mile and return
        double distanceInNauticalMile = this.airTransport.getDistanceTravelled();

        return distanceInNauticalMile * 1.151;
    }

    @Override
    public double getTravelCostPerMile() {
        // calculate cost per mile from total cost
        double totalCost = this.airTransport.getTravelCostTotal();

        return totalCost / this.getDistanceTravelled();
    }
}

Demo

package com.bigboxcode;

public class Main {
    public static void main(String[] args) {

        System.out.println("Get information of Bus travel...");

        Bus bus = new Bus();
        System.out.println("\nNumber of wheels: " + bus.getNumberOfWheels());
        System.out.println("Weight(kg): " + bus.getWeight());
        System.out.println("Distance(miles): " + bus.getDistanceTravelled());
        System.out.println("Cost per mile: " + bus.getTravelCostPerMile());

        System.out.println("\n\n-------------------------------------------\n\n");

        System.out.println("Get information of Plane travel...");

        AirTransportAdapter planeTransport = new AirTransportAdapter(new Plane());
        System.out.println("\nNumber of wheels: " + planeTransport.getNumberOfWheels());
        System.out.println("Weight(kg): " + planeTransport.getWeight());
        System.out.println("Distance(miles): " + planeTransport.getDistanceTravelled());
        System.out.println("Cost per mile: " + planeTransport.getTravelCostPerMile());
    }
}

Output

Get information of Bus travel...

Number of wheels: 4
Weight(kg): 10000.0
Distance(miles): 1000.0
Cost per mile: 5.0


-------------------------------------------


Get information of Plane travel...

Number of wheels: 3
Weight(kg): 127000.0
Distance(miles): 575.5
Cost per mile: 5.212858384013901

Source Code

Use the following link to get the source code:

Leave a Comment