Motivation
- Needs for defining the outline of an algorithm and let subclasses do some work.
- Needs for providing a fundamental method for code reuse that allows subclasses to specify behaviors.
Intent
- Define the skeleton of an algorithm in an operation, deferring some steps to sub-classes.
- Let sub-classes redefine certain steps of an algorithm without changing the algorithm's structure.
Structure
- Abstract class contains the template method and provides a framework that concrete classes can be plugged into.
- Template method defines an algorithm in terms of abstract operations that subclasses override to provide concrete behavior.
- The ConreteClass implements the abstract operations which are called when the template method needs them.
Implementation in Java
abstract class AbstractClass {
final void templateMethod() {
operation1();
operation2();
concreteOperation();
hook();
}
final void concreteOperation() {
//a concrete implementation
}
abstract void operation1(); // abstract operations, must be implemented by sub-classes
abstract void operation2();
void hook() {
// default implementation, subclasses are free to override
}
}
When we look at the above code, there are four different types of methods used in the parent AbstractClass:
- Concrete methodsThese methods maybe used in the template method directly or used by subclasses. Concrete methods are not intended to be overridden so it's modified with final.
- Abstract methodsThese methods that must be implemented by subclasses.
- Hook methodsThese methods give subclasses the ability to "hook into" the algorithm at various points if they wish, a subclass is also free to ignore the hook.
- Template methodsThe template method defines the order of operations each defined by a method listed above.
Hollywood Principle
The Hollywood Principle (Don't call us, we'll call you) avoids low level components depending on high level components, and instead allows low level classes (ConcreteClass) a way of hooking into the parent class (AbstractClass). The Template Method pattern makes use of the Hollywood Principle. When we design the Template Method Pattern we are telling subclasses, "don't call us, we'll call you". The template method in the abstract class controls the overall process, "calling" subclass methods when necessary. Subclasses never call the abstract class directly without being "called" first. Subclasses simply provides implementation details.
JDK Implementations
- javax.swing.JFrame#paint(Graphics g)
- java.applet.Applet#init(), #start(), #stop(), #destroy(), #paint(Graphics g)
- java.util.Collections#sort()
Related Patterns
- The Strategy and Template Method Patterns both encapsulate algorithms, one by inheritance and one by composition.
- The Factory Method is a specialization of Template Method.