Defining Algorithm Skeletons with the Template Method Pattern
The Template Method pattern establishes the skeleton of an algorithm in a base class, deferring specific step implementations to subclasses. This ensures the algorithm's structure remains unchanged while allowing customized behavior for individual steps.
Consider an automated vehicle system where the operational sequence must remain strictly consistent: engine ignition, safety alert, route navigation, and engine shutdown. Different vehicle types will implement these steps uniquely, but the overarching execution flow must not be altered.
Abstract Base Class
public abstract class AutomatedVehicle {
public abstract void igniteEngine();
public abstract void soundAlert();
public abstract void plotRoute();
public abstract void haltEngine();
public final void executeDrivingSequence() {
igniteEngine();
soundAlert();
plotRoute();
haltEngine();
}
}Concrete Implementation: Sport Coupe
public class SportCoupe extends AutomatedVehicle {
@Override
public void igniteEngine() {
System.out.println("Sport Coupe: Engine roaring to life");
}
@Override
public void soundAlert() {
System.out.println("Sport Coupe: Honking horn");
}
@Override
public void plotRoute() {
System.out.println("Sport Coupe: Calculating fastest route");
}
@Override
public void haltEngine() {
System.out.println("Sport Coupe: Engine turned off");
}
}Concrete Implementation: Heavy Truck
public class HeavyTruck extends AutomatedVehicle {
@Override
public void igniteEngine() {
System.out.println("Heavy Truck: Diesel engine starting");
}
@Override
public void soundAlert() {
System.out.println("Heavy Truck: Blowing air horn");
}
@Override
public void plotRoute() {
System.out.println("Heavy Truck: Routing via truck-friendly roads");
}
@Override
public void haltEngine() {
System.out.println("Heavy Truck: Engine braking and stopping");
}
}Execution Simulation
public class Simulator {
public static void main(String[] args) {
AutomatedVehicle coupe = new SportCoupe();
coupe.executeDrivingSequence();
AutomatedVehicle truck = new HeavyTruck();
truck.executeDrivingSequence();
}
}