The Template Method is a behavioral design pattern commonly used in object-oriented programming. In PHP, it provides a robust way to define the structure of an algorithm while allowing subclasses to alter specific steps. This pattern enhances code reusability and flexibility across different implementations.
The pattern relies on an abstract base class that outlines the overall algorithm as a method. This method is typically called the "template method." Certain steps in this algorithm are declared as abstract methods, which must be implemented by subclasses. This structure ensures consistency in the flow while enabling specific logic to vary per implementation.
Below is a PHP example demonstrating how to implement a simple shopping cart using the Template Method pattern. It shows how a fixed workflow can be extended through subclassing.
<?php abstract class ShoppingCartTemplate { // Template method: defines the fixed process public final function processCart() { $this->addItems(); $this->calculateTotal(); $this->showCart(); } // Steps to be defined by subclasses protected abstract function addItems(); protected abstract function calculateTotal(); protected abstract function showCart(); } // First shopping cart implementation class ShoppingCart1 extends ShoppingCartTemplate { protected function addItems() { echo "Adding items to Shopping Cart 1.<br/>"; } protected function calculateTotal() { echo "Calculating total for Shopping Cart 1.<br/>"; } protected function showCart() { echo "Displaying items in Shopping Cart 1.<br/>"; } } // Second shopping cart implementation class ShoppingCart2 extends ShoppingCartTemplate { protected function addItems() { echo "Adding items to Shopping Cart 2.<br/>"; } protected function calculateTotal() { echo "Calculating total for Shopping Cart 2.<br/>"; } protected function showCart() { echo "Displaying items in Shopping Cart 2.<br/>"; } } // Example usage $cart1 = new ShoppingCart1(); $cart1->processCart(); echo "<br/>"; $cart2 = new ShoppingCart2(); $cart2->processCart(); ?>
In the example above, the ShoppingCartTemplate class defines the fixed algorithm using the processCart() method. This method dictates the sequence: adding items, calculating totals, and displaying results. Subclasses ShoppingCart1 and ShoppingCart2 implement their own versions of these steps.
The Template Method pattern offers several advantages:
In PHP projects, this pattern proves useful in scenarios like form validation, payment processing workflows, product display systems, and more. It allows developers to centralize the workflow logic while delegating specific tasks to modules or plugins, enhancing clarity and long-term maintainability.