The Stratigy Pattern





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(105);


echo 
'<br />';


echo 
$calculator->setBehavior(
                    new 
SubtractBehavior
                
)
                ->
calculate(105);


echo 
'<br />';


echo 
$calculator->setBehavior(
                    new 
MultiplyBehavior
                
)
                ->
calculate(105);

?>
hosting nl domeinnaam checken