The Stratigy Pattern
Tweet
The Stratigy Pattern is another easy design pattern. Here a simple example.
The Stratigy Pattern is one of the 23 GoF patterns that are generally considered the foundation for all other patterns. They are categorized in three groups: Creational, Structural, and Behavioral.
If you want to learn all about design patterns, take a look at the following book.
<?php
//---------------------------------------------
// Stratigy Interface CalculatorBehaviorStrategy
//---------------------------------------------
/**
* Calculate Behavior Interface
*/
interface CalculatorBehaviorStrategy
{
public function calculate($a, $b);
}
//---------------------------------------------
// Concrete Stratigy AddBehavior Class
//---------------------------------------------
/**
* Concrete AddBehavior implements CalculatorBehaviorStrategy
*/
final class AddBehavior implements CalculatorBehaviorStrategy
{
public function calculate($a, $b)
{
return $a + $b;
}
}
//---------------------------------------------
// Concrete Stratigy SubtractBehavior Class
//---------------------------------------------
/**
* Concrete SubtractBehavior implements CalculatorBehaviorStrategy
*/
final class SubtractBehavior implements CalculatorBehaviorStrategy
{
public function calculate($a, $b)
{
return $a - $b;
}
}
//---------------------------------------------
// Concrete Stratigy MultiplyBehavior Class
//---------------------------------------------
/**
* Concrete MultiplyBehavior implements CalculatorBehaviorStrategy
*/
class MultiplyBehavior implements CalculatorBehaviorStrategy
{
public function calculate($a, $b)
{
return $a * $b;
}
}
//---------------------------------------------
// Concrete Calculate Class
//---------------------------------------------
/**
* Concrete Calculator class
*/
class Calculator
{
/**
* The Behavior used by this class
* @var Interface CalculatorBehaviorStrategy $behaviour
*/
private $behavior;
/**
* class constructor
* @param CalculatorBehaviorStrategy $behavior
*/
public function __construct(CalculatorBehaviorStrategy $behavior)
{
if (null !== $behavior) {
$this->setBehavior($behavior);
}
}
/**
* Set the CalculatorBehaviorStrategy to the class
* @param CalculatorBehaviorStrategy $behavior
* @return Calculator
*/
public function setBehavior(CalculatorBehaviorStrategy $behavior)
{
$this->behavior = $behavior;
return $this;
}
/**
* Calculate function
* @param int $a
* @param int $b
* @return int result of self::CalculatorBehaviorStrategy->calculate()
*/
public function calculate($a, $b)
{
if (!$this->behavior instanceof CalculatorBehaviorStrategy) {
throw new Exception('sorry, could not perform the calculate method, having a faulty stratigy object');
}
return $this->behavior->calculate($a, $b);
}
}
//---------------------------------------------
// Runtime Examples
//---------------------------------------------
$calculator = new Calculator(new AddBehavior);
echo $calculator->calculate(10, 5);
echo '<br />';
echo $calculator->setBehavior(
new SubtractBehavior
)
->calculate(10, 5);
echo '<br />';
echo $calculator->setBehavior(
new MultiplyBehavior
)
->calculate(10, 5);
?>
