The Template Design Pattern is a behavioral pattern that defines the skeleton of an algorithm in a base class but allows subclasses to override specific steps of the algorithm without changing its structure. This pattern is useful when you have a common sequence of steps that are shared among multiple subclasses but may vary in certain details.
Components of the Template Design Pattern:
- Abstract Class (Template): Defines the template method that outlines the algorithm’s structure and includes some default behavior. It may also include abstract methods that must be implemented by subclasses.
- Concrete Class: Implements the abstract methods defined in the abstract class and may override some steps of the algorithm.
Simple Example:
Let’s say we want to create a system for preparing beverages. The process of preparing a beverage involves several common steps, but the details may vary for different types of beverages.
1. Abstract Class (Template):
// Abstract class defining the template method
abstract class Beverage {
// Template method
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring in cup");
}
}
2. Concrete Classes:
// Concrete class for Tea
class Tea extends Beverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding lemon");
}
}
// Concrete class for Coffee
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
3. Client Code:
public class TemplatePatternDemo {
public static void main(String[] args) {
Beverage tea = new Tea();
Beverage coffee = new Coffee();
System.out.println("Preparing tea...");
tea.prepareRecipe();
System.out.println("\nPreparing coffee...");
coffee.prepareRecipe();
}
}
Explanation:
- Abstract Class (Template):
Beverage
defines theprepareRecipe
method, which is a template method outlining the steps to prepare a beverage. It includes some default behavior (e.g.,boilWater
,pourInCup
) and abstract methods (brew
,addCondiments
) that subclasses need to implement. - Concrete Classes:
Tea
andCoffee
extend theBeverage
class and provide specific implementations for thebrew
andaddCondiments
methods. - Client Code: Demonstrates how to use the template method to prepare different types of beverages using the common algorithm defined in the abstract class.
Benefits of the Template Design Pattern:
- Code Reusability: Common code is defined in the base class, reducing duplication and ensuring consistency.
- Flexibility: Subclasses can provide specific implementations for certain steps of the algorithm, allowing customization while preserving the overall structure.
- Control Over Algorithm: The base class controls the algorithm’s structure, ensuring that all necessary steps are executed in the correct order.
Use Cases of the Template Design Pattern:
- Frameworks: When creating a framework, you can use the template pattern to define a set of steps that the framework will follow, allowing users to customize specific steps.
- Workflow Systems: Systems that follow a common workflow but allow for varying details in different scenarios (e.g., data processing pipelines, report generation).
- Algorithmic Processes: When implementing algorithms with a fixed structure but varying implementations (e.g., game AI behaviors, data parsing).