Accueil / Tutoriels / Strategy
Strategy
Publié le 24 Mars 2025Strategy (stratégie en français) est un design pattern comportemental qui permet de définir une famille d’algorithmes, de les encapsuler dans des classes séparées et de les rendre interchangeables.
Principe
Exemples d’utilisations
Système de login avec plusieurs méthodes de connexion
Gestion des frais de livraison sur un site de e-commerce
Points d’attentions
Implémenter le pattern Strategy
Exemple d'utilisation de Strategy en Go :
package shippingStrategy
// Définition de l'interface Strategy
type ShippingStrategy interface {
CalculateCost(weight float64, distance float64) float64
}
package shippingStrategy
type ShippingContext struct {
strategy ShippingStrategy
}
func (s *ShippingContext) SetStrategy(strategy ShippingStrategy) {
s.strategy = strategy
}
func (s *ShippingContext) CalculateShipping(weight float64, distance float64) float64 {
return s.strategy.CalculateCost(weight, distance)
}
package shippingStrategy
type Colissimo struct{}
func (c Colissimo) CalculateCost(weight float64, distance float64) float64 {
return 5.0
}
package shippingStrategy
type Chronopost struct{}
func (cr Chronopost) CalculateCost(weight float64, distance float64) float64 {
return weight*0.5 + distance*0.2
}
package shippingStrategy
type MondialRelay struct{}
func (mr MondialRelay) CalculateCost(weight float64, distance float64) float64 {
if distance < 100 {
return 4.0
}
return 7.0
}
package main
import (
"fmt"
"designPatterns/strategy/shippingStrategy"
)
func main() {
context := shippingStrategy.ShippingContext{}
context.SetStrategy(shippingStrategy.Colissimo{})
fmt.Println("Colissimo : ", context.CalculateShipping(2, 50))
context.SetStrategy(shippingStrategy.Chronopost{})
fmt.Println("Chronopost : ", context.CalculateShipping(2, 50))
context.SetStrategy(shippingStrategy.MondialRelay{})
fmt.Println("Mondial Relay : ", context.CalculateShipping(2, 150))
}
Le même exemple en PHP :
namespace Practice\DesignPatterns\Strategy;
interface ShippingStrategyInterface
{
public function calculateCost(float $weight, float $distance): float;
}
namespace Practice\DesignPatterns\Strategy;
class ShippingContext
{
private ShippingStrategyInterface $strategy;
public function setStrategy(ShippingStrategyInterface $strategy): void
{
$this->strategy = $strategy;
}
public function calculateShipping(float $weight, float $distance): float
{
return $this->strategy->calculateCost($weight, $distance);
}
}
namespace Practice\DesignPatterns\Strategy;
class Colissimo implements ShippingStrategyInterface
{
public function calculateCost(float $weight, float $distance): float
{
return 5.0;
}
}
namespace Practice\DesignPatterns\Strategy;
class Chronopost implements ShippingStrategyInterface
{
public function calculateCost(float $weight, float $distance): float
{
return $weight * 0.5 + $distance * 0.2;
}
}
namespace Practice\DesignPatterns\Strategy;
class MondialRelay implements ShippingStrategyInterface
{
public function calculateCost(float $weight, float $distance): float
{
return $distance < 100 ? 4.0 : 7.0;
}
}
declare(strict_types=1);
use Practice\DesignPatterns\Strategy\Chronopost;
use Practice\DesignPatterns\Strategy\Colissimo;
use Practice\DesignPatterns\StrategyMondialRelay;
use Practice\DesignPatterns\Strategy\ShippingContext;
require "./vendor/autoload.php";
$context = new ShippingContext();
$context->setStrategy(new Colissimo());
echo "Colissimo : " . $context->calculateShipping(2, 50);
$context->setStrategy(new Chronopost());
echo "Chronopost : " . $context->calculateShipping(2, 50);
$context->setStrategy(new MondialRelay());
echo "Mondial Relay : " . $context->calculateShipping(2, 150);