Le design pattern stratégie

Choisir dynamiquement quel algorithme exécuter.

Le design pattern stratégie (strategy en anglais) permet de choisir dynamiquement un algorithme à exécuter en fonction d'une situation.

Prenons l'exemple d'un web-service qui doit retourner une réponse formatée dans différents formats : xml, json etc...

Choisir le format de retour d'un webservice

abstract class RenderStrategy { abstract public function format($toFormat); } class JsonRenderStrategy extends RenderStrategy { public function format($toFormat) { return json_encode($toFormat); } } class XmlRenderStrategy extends RenderStrategy { public function format($toFormat) { $xml = new SimpleXMLElement('<root/>'); array_walk_recursive($toFormat, function($item, $key) use($xml){ $xml->addChild($key, $item); }); return $xml->asXML(); } } class Response { protected $renderStrategy = null; public function setRenderStrategy(RenderStrategy $renderStrategy) { $this->renderStrategy = $renderStrategy; } public function render($response) { echo $this->renderStrategy->format($response); } } $response = new Response(); $response->setRenderStrategy(new JsonRenderStrategy()); $response->render(array('description' => 'tutoriel sur le design pattern strategy')); /* Sortie : * {"description":"tutoriel sur le design pattern strategy"} */ $response->setRenderStrategy(new XmlRenderStrategy()); $response->render(array('description' => 'tutoriel sur le design pattern strategy')); /* Sortie : * <root><description>tutoriel sur le design pattern strategy</description></root> */