{"id":17267,"date":"2026-10-26T09:00:00","date_gmt":"2026-10-26T08:00:00","guid":{"rendered":"https:\/\/wata.es\/?p=17267"},"modified":"2026-09-10T08:48:02","modified_gmt":"2026-09-10T06:48:02","slug":"strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales","status":"publish","type":"post","link":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/","title":{"rendered":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">El <strong>Strategy Pattern<\/strong> es uno de esos patrones que tienen sentido cuando el problema acompa\u00f1a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es simple: tienes una misma intenci\u00f3n de negocio, pero varias formas de ejecutarla. Mientras eso se mantiene peque\u00f1o, normalmente no pasa nada. El problema empieza cuando esa variaci\u00f3n crece, se mezcla en una clase central y cada caso nuevo obliga a seguir acumulando decisiones en el mismo sitio.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">En proyectos Symfony esto pasa bastante: una operaci\u00f3n que cambia seg\u00fan el canal, el proveedor, el formato o una regla concreta de negocio. Y ah\u00ed es donde Strategy puede ser una forma \u00fatil de separar comportamientos sin complicar m\u00e1s de la cuenta el dise\u00f1o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave no est\u00e1 en usar el patr\u00f3n porque exista, sino en identificar cu\u00e1ndo ayuda de verdad a repartir responsabilidades y a mantener el c\u00f3digo en un estado razonable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema real no es el <code>if<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un <code>if<\/code> no es un problema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dos, tampoco.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El problema empieza cuando una misma intenci\u00f3n de negocio puede ejecutarse de varias formas y toda esa variaci\u00f3n acaba concentrada en una \u00fanica clase:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>seg\u00fan el canal;<\/li>\n\n\n\n<li>seg\u00fan el proveedor;<\/li>\n\n\n\n<li>seg\u00fan el tipo de cliente;<\/li>\n\n\n\n<li>seg\u00fan el pa\u00eds;<\/li>\n\n\n\n<li>seg\u00fan el formato;<\/li>\n\n\n\n<li>seg\u00fan la operaci\u00f3n;<\/li>\n\n\n\n<li>seg\u00fan el contexto de ejecuci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ah\u00ed es donde el c\u00f3digo empieza a degradarse de una forma bastante predecible:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la clase crece;<\/li>\n\n\n\n<li>el constructor empieza a llenarse de dependencias;<\/li>\n\n\n\n<li>a\u00f1adir un caso nuevo obliga a tocar c\u00f3digo antiguo;<\/li>\n\n\n\n<li>testear una variante concreta empieza a ser inc\u00f3modo;<\/li>\n\n\n\n<li>y el servicio principal se convierte en un punto de acumulaci\u00f3n de decisiones.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ese es el escenario donde <strong>Strategy<\/strong> suele empezar a tener sentido.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 es el Strategy Pattern<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es bastante simple: si tienes varios comportamientos para una misma intenci\u00f3n, no metas toda la l\u00f3gica en una clase central.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Defines una interfaz com\u00fan, creas una implementaci\u00f3n por variante y delegas la ejecuci\u00f3n en la que corresponda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En otras palabras:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>una misma intenci\u00f3n;<\/li>\n\n\n\n<li>varias implementaciones posibles;<\/li>\n\n\n\n<li>una selecci\u00f3n en runtime seg\u00fan el contexto.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Lo valioso del patr\u00f3n no est\u00e1 en la definici\u00f3n te\u00f3rica, sino en lo que evita: clases con demasiadas responsabilidades, condicionales que crecen sin parar y l\u00f3gica dif\u00edcil de extender o testear.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">No todo comportamiento variable necesita un Strategy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed conviene parar un momento, porque es justo el punto donde m\u00e1s f\u00e1cil es sobredise\u00f1ar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ver variaci\u00f3n de comportamiento y saltar autom\u00e1ticamente a Strategy suele ser un error. En algunos casos, la mejor soluci\u00f3n no es un resolvedor con varias estrategias, sino <strong>polimorfismo<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si el comportamiento pertenece de forma natural al propio objeto, seguramente tiene m\u00e1s sentido que viva ah\u00ed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, un c\u00e1lculo de coste de env\u00edo seg\u00fan transportista no es el mejor caso para justificar un Strategy. Si cada transportista tiene su propia l\u00f3gica y eso forma parte natural de su responsabilidad, probablemente tendr\u00eda m\u00e1s sentido modelarlo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float;\n}\nfinal class SeurCarrier implements Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 5 + ($weight * 0.80);\n\u00a0\u00a0\u00a0 }\n}\nfinal class DhlCarrier implements Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 7 + ($weight * 0.65);\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y el consumo ser\u00eda directo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$cost = $carrier-&gt;calculateShippingCost($weight);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed no hace falta una capa adicional para recorrer estrategias ni un <code>supports()<\/code> para decidir cu\u00e1l aplica. El comportamiento ya est\u00e1 donde deber\u00eda estar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste es un matiz importante: no se trata de elegir entre <code>if<\/code> y Strategy, sino de elegir la abstracci\u00f3n correcta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y a veces la abstracci\u00f3n correcta no es Strategy sino simplemente un modelo mejor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cu\u00e1ndo s\u00ed merece la pena usar Strategy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Strategy encaja mejor cuando la selecci\u00f3n del comportamiento <strong>no pertenece de forma natural a una entidad concreta<\/strong>, sino que se decide desde fuera, por contexto, por reglas de aplicaci\u00f3n o por composici\u00f3n din\u00e1mica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cuando una pol\u00edtica de negocio cambia seg\u00fan condiciones externas;<\/li>\n\n\n\n<li>cuando varias implementaciones comparten una intenci\u00f3n pero no forman parte del mismo modelo de dominio;<\/li>\n\n\n\n<li>cuando est\u00e1s desacoplando integraciones con terceros;<\/li>\n\n\n\n<li>cuando la decisi\u00f3n se toma en un servicio de aplicaci\u00f3n;<\/li>\n\n\n\n<li>cuando quieres a\u00f1adir variantes sin reabrir una clase central.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En ese tipo de escenarios s\u00ed suele compensar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 encaja tan bien en Symfony<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Symfony ayuda bastante a implementar este patr\u00f3n de forma limpia porque el contenedor de servicios ya est\u00e1 pensado para trabajar con m\u00faltiples implementaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>tener varias clases implementando la misma interfaz;<\/li>\n\n\n\n<li>registrarlas autom\u00e1ticamente;<\/li>\n\n\n\n<li>etiquetarlas con tags;<\/li>\n\n\n\n<li>inyectarlas como iterable;<\/li>\n\n\n\n<li>resolver la implementaci\u00f3n adecuada sin acoplarte a clases concretas.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator;\nfinal class DiscountResolver\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #&#91;TaggedIterator('app.discount_strategy')]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y en <code>services.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n\u00a0\u00a0\u00a0 App\\Discount\\Strategy\\:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resource: '..\/src\/Discount\/Strategy\/*'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tags: &#91;'app.discount_strategy']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En Symfony esto sale bastante natural. No hace falta montar infraestructura rara ni inventarse mecanismos propios de descubrimiento de implementaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ese buen encaje con el framework es una de las razones por las que el patr\u00f3n resulta especialmente c\u00f3modo en este ecosistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Casos de uso reales de Strategy Pattern en Symfony<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Notificaciones por canal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste es uno de los casos m\u00e1s claros.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tienes una misma intenci\u00f3n de negocio: notificar algo. Pero la forma de hacerlo cambia seg\u00fan el canal:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>email;<\/li>\n\n\n\n<li>SMS;<\/li>\n\n\n\n<li>push;<\/li>\n\n\n\n<li>Slack;<\/li>\n\n\n\n<li>webhook.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed la implementaci\u00f3n cambia bastante, las dependencias suelen ser distintas y la decisi\u00f3n normalmente se toma desde fuera del propio objeto. No est\u00e1s modelando el comportamiento natural de una entidad, sino resolviendo una pol\u00edtica de env\u00edo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ah\u00ed Strategy encaja bien.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool;\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void;\n}\nfinal class EmailNotificationStrategy implements NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private MailerInterface $mailer\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $channel === 'email';\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ env\u00edo por email\n\u00a0\u00a0\u00a0 }\n}\nfinal class SmsNotificationStrategy implements NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private SmsClient $smsClient\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $channel === 'sms';\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ env\u00edo por SMS\n\u00a0\u00a0\u00a0 }\n}\nfinal class NotificationSender\n{\n\u00a0\u00a0\u00a0 \/**\n\u00a0\u00a0\u00a0\u00a0 * @param iterable&lt;NotificationStrategyInterface> $strategies\n\u00a0\u00a0\u00a0\u00a0 *\/\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(string $channel, Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($this->strategies as $strategy) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($strategy->supports($channel)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $strategy->send($notification);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new \\RuntimeException(sprintf('Channel \"%s\" not supported', $channel));\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Integraciones con proveedores externos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Otro caso muy t\u00edpico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A nivel funcional quieres hacer \u201clo mismo\u201d, pero el proveedor cambia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pasarelas de pago;<\/li>\n\n\n\n<li>transportistas externos;<\/li>\n\n\n\n<li>CRMs;<\/li>\n\n\n\n<li>sistemas de firma;<\/li>\n\n\n\n<li>servicios de verificaci\u00f3n;<\/li>\n\n\n\n<li>proveedores de identidad.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En este tipo de escenarios, intentar centralizar toda la l\u00f3gica suele llevar a una clase llena de ramas, clientes HTTP, adaptaciones de payload y tratamiento espec\u00edfico de errores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Separarlo por estrategias suele ser bastante m\u00e1s razonable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PaymentStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $provider): bool;\n\u00a0\u00a0\u00a0 public function charge(PaymentRequest $request): PaymentResult;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cada proveedor encapsula su comportamiento, sus dependencias y su mapping. El caso de uso o servicio de aplicaci\u00f3n s\u00f3lo resuelve cu\u00e1l necesita.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exportaciones en distintos formatos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Muy com\u00fan en aplicaciones de gesti\u00f3n y backoffice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La intenci\u00f3n es la misma: exportar datos. Pero no es lo mismo exportar a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSV;<\/li>\n\n\n\n<li>Excel;<\/li>\n\n\n\n<li>JSON;<\/li>\n\n\n\n<li>XML;<\/li>\n\n\n\n<li>PDF.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed la elecci\u00f3n del comportamiento suele venir dada por contexto de aplicaci\u00f3n, no por una responsabilidad natural de una entidad de dominio. Y cada formato puede requerir librer\u00edas, estructura y tratamiento propios.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface ExportStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $format): bool;\n\u00a0\u00a0\u00a0 public function export(array $data): string;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cada formato en su clase, cada implementaci\u00f3n aislada y un servicio principal mucho m\u00e1s limpio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pol\u00edticas de negocio seg\u00fan contexto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste es uno de los usos m\u00e1s interesantes, aunque es menos vistoso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>aplicar descuentos seg\u00fan reglas de negocio;<\/li>\n\n\n\n<li>decidir una pol\u00edtica de procesamiento seg\u00fan el origen;<\/li>\n\n\n\n<li>ejecutar una validaci\u00f3n distinta seg\u00fan la transici\u00f3n;<\/li>\n\n\n\n<li>seleccionar una acci\u00f3n seg\u00fan el tipo de operaci\u00f3n;<\/li>\n\n\n\n<li>resolver una regla diferente seg\u00fan el canal o el entorno.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En estos casos lo importante es que la variaci\u00f3n de comportamiento <strong>no pertenece claramente a una entidad concreta<\/strong>, sino a una pol\u00edtica que la aplicaci\u00f3n necesita resolver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ah\u00ed Strategy suele ser una buena forma de encapsular la l\u00f3gica sin meter todo en el mismo servicio.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejemplo con descuentos<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>interface DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool;\n\u00a0\u00a0\u00a0 public function apply(Order $order): int;\n}\nfinal class PremiumDiscountStrategy implements DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $order->customer()->isPremium();\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function apply(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return (int) round($order->subtotal() * 0.10);\n\u00a0\u00a0\u00a0 }\n}\nfinal class CampaignDiscountStrategy implements DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $order->hasActiveCampaign();\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function apply(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 500;\n\u00a0\u00a0\u00a0 }\n}\nfinal class DiscountResolver\n{\n\u00a0\u00a0\u00a0 \/**\n\u00a0\u00a0\u00a0\u00a0 * @param iterable&lt;DiscountStrategyInterface> $strategies\n\u00a0\u00a0\u00a0\u00a0 *\/\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function resolve(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($this->strategies as $strategy) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($strategy->supports($order)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $strategy->apply($order);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Cu\u00e1ndo no usar Strategy Pattern<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este punto es tan importante como el resto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No todo necesita un Strategy. Y en algunos equipos acaba habiendo cierta tendencia a montar patrones antes de que exista el problema que justificaba usarlos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si tienes dos casos simples, estables, y la l\u00f3gica es m\u00ednima, probablemente un <code>match<\/code> o incluso un <code>if<\/code> resuelven mejor el problema.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return match ($type) {\n\u00a0\u00a0\u00a0 'fixed' => 100,\n\u00a0\u00a0\u00a0 'percent' => 200,\n\u00a0\u00a0\u00a0 default => 0,\n};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto no necesita una interfaz, tres implementaciones y un resolvedor. Necesita no complicar algo que todav\u00eda es simple.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Strategy empieza a compensar cuando se cumplen varias de estas condiciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la l\u00f3gica de cada caso empieza a crecer;<\/li>\n\n\n\n<li>cada variante necesita dependencias propias;<\/li>\n\n\n\n<li>el n\u00famero de casos puede seguir aumentando;<\/li>\n\n\n\n<li>testear cada comportamiento por separado aporta valor;<\/li>\n\n\n\n<li>tocar un caso obliga a reabrir siempre la misma clase;<\/li>\n\n\n\n<li>la selecci\u00f3n del comportamiento se hace desde un servicio de aplicaci\u00f3n o desde una pol\u00edtica externa.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Se\u00f1ales de que te puede venir bien en un proyecto Symfony<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hay s\u00edntomas bastante claros.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El servicio principal empieza a decidir demasiadas cosas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si tu <code>CheckoutService<\/code>, <code>NotificationService<\/code>, <code>ExportService<\/code> o similar acumula demasiadas ramas \u201cseg\u00fan el tipo\u201d, normalmente hay una abstracci\u00f3n pendiente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El constructor empieza a llenarse de dependencias que no siempre se usan<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando una sola clase necesita demasiados colaboradores porque soporta demasiadas variantes, casi siempre hay una distribuci\u00f3n de responsabilidades mejorable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A\u00f1adir un caso nuevo siempre implica tocar la misma clase delicada<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si cada nueva variante obliga a modificar un servicio central que ya mezcla demasiadas decisiones, est\u00e1s generando un punto de fricci\u00f3n innecesario.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Probar una variante concreta es cada vez m\u00e1s molesto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando para testear una rama concreta tienes que montar medio contexto porque la l\u00f3gica est\u00e1 incrustada en una clase grande, probablemente esa l\u00f3gica est\u00e1 mal colocada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ventajas reales del Strategy Pattern<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las ventajas no son te\u00f3ricas. En proyectos reales se notan bastante cuando el patr\u00f3n est\u00e1 bien aplicado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La primera es <strong>mantenibilidad<\/strong>. Cada comportamiento vive en su propia clase y deja de engordar un servicio central.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La segunda es <strong>extensibilidad<\/strong>. A\u00f1adir una variante nueva suele consistir en crear una implementaci\u00f3n nueva, no en reabrir una pieza especialmente sensible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La tercera es <strong>testabilidad<\/strong>. Probar comportamientos aislados es bastante m\u00e1s c\u00f3modo que testear un servicio con m\u00faltiples ramas mezcladas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La cuarta es <strong>claridad<\/strong>. Cuando alguien entra al proyecto, entender el sistema por variantes suele ser m\u00e1s f\u00e1cil si cada una est\u00e1 encapsulada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y la quinta, en Symfony, es que <strong>encaja muy bien con el contenedor y el sistema de servicios<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Errores habituales al aplicarlo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tampoco conviene idealizarlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sobredise\u00f1ar demasiado pronto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9ste es el error m\u00e1s frecuente. Aplicar Strategy a algo que todav\u00eda es demasiado simple s\u00f3lo mete ruido.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No controlar bien el criterio de selecci\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si varias estrategias pueden responder <code>true<\/code> al mismo caso y no tienes una pol\u00edtica clara, introduces ambig\u00fcedad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ese caso conviene decidir si debe haber una \u00fanica estrategia v\u00e1lida, si debe existir prioridad o si realmente necesitas ejecutar varias.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fragmentar sin mejorar realmente el dise\u00f1o<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Separar responsabilidades est\u00e1 bien. Pero si para seguir un flujo sencillo hay que saltar entre demasiadas clases peque\u00f1as que apenas aportan nada, el coste cognitivo sube y el dise\u00f1o empeora.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usarlo para tapar un mal modelo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A veces el problema no es la ausencia de un patr\u00f3n. Es que el dominio est\u00e1 mal modelado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y crear m\u00e1s servicios no arregla eso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing: donde m\u00e1s suele compensar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las partes donde mejor se nota este patr\u00f3n es en tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una estrategia concreta suele ser f\u00e1cil de probar en aislamiento:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function test_premium_discount_is_applied(): void\n{\n\u00a0\u00a0\u00a0 $order = $this->createPremiumOrderWithSubtotal(10000);\n\u00a0\u00a0\u00a0 $strategy = new PremiumDiscountStrategy();\n\u00a0\u00a0\u00a0 self::assertTrue($strategy->supports($order));\n\u00a0\u00a0\u00a0 self::assertSame(1000, $strategy->apply($order));\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y el resolvedor tambi\u00e9n se puede testear de forma simple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function test_it_uses_the_first_supported_strategy(): void\n{\n\u00a0\u00a0\u00a0 $strategy = $this->createMock(DiscountStrategyInterface::class);\n\u00a0\u00a0\u00a0 $strategy->method('supports')->willReturn(true);\n\u00a0\u00a0\u00a0 $strategy->method('apply')->willReturn(500);\n\u00a0\u00a0\u00a0 $resolver = new DiscountResolver(&#91;$strategy]);\n\u00a0\u00a0\u00a0 self::assertSame(500, $resolver->resolve($order));\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eso normalmente es bastante m\u00e1s c\u00f3modo que probar una clase central con m\u00faltiples ramas y demasiadas dependencias mezcladas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El <strong>Strategy Pattern<\/strong> aporta valor cuando evita que una misma clase concentre demasiadas variantes de comportamiento y demasiadas decisiones de negocio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En Symfony encaja especialmente bien porque el framework facilita mucho trabajar con m\u00faltiples implementaciones, tags e inyecci\u00f3n de estrategias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pero precisamente por eso conviene usarlo con criterio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No toda variaci\u00f3n de comportamiento necesita un Strategy. Si el comportamiento pertenece al propio objeto, seguramente tiene m\u00e1s sentido empezar por polimorfismo. Si el problema sigue siendo simple, quiz\u00e1 un <code>match<\/code> sea suficiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Strategy merece la pena cuando la selecci\u00f3n del comportamiento se decide desde fuera, depende del contexto, responde a una pol\u00edtica de aplicaci\u00f3n o necesita crecer sin convertir una clase central en un cuello de botella de mantenimiento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En esos casos s\u00ed suele funcionar muy bien. Y en <strong>WATA Factory<\/strong> es un patr\u00f3n que utilizamos precisamente en ese tipo de escenarios: cuando necesitamos desacoplar comportamientos, facilitar la evoluci\u00f3n del sistema y mantener el c\u00f3digo preparado para crecer sin perder claridad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Porque, al final, la clave no est\u00e1 en aplicar patrones. Est\u00e1 en elegir soluciones que sigan teniendo sentido cuando el proyecto evoluciona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El Strategy Pattern es uno de esos patrones que tienen sentido cuando el problema acompa\u00f1a. La idea es simple: tienes una misma intenci\u00f3n de negocio, pero varias formas de ejecutarla. Mientras eso se mantiene peque\u00f1o, normalmente no pasa nada. El problema empieza cuando esa variaci\u00f3n crece, se mezcla en una clase central y cada caso [&hellip;]<\/p>\n","protected":false},"author":45,"featured_media":17273,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[89,183],"tags":[],"class_list":["post-17267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-noticias","category-tecnologia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory<\/title>\n<meta name=\"description\" content=\"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory\" \/>\n<meta property=\"og:description\" content=\"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/\" \/>\n<meta property=\"og:site_name\" content=\"WATA Factory\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/watafactory\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-26T08:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Victor Galo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@watafactory\" \/>\n<meta name=\"twitter:site\" content=\"@watafactory\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Victor Galo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/\"},\"author\":{\"name\":\"Victor Galo\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#\\\/schema\\\/person\\\/2fe4cf3f05ff348d077f2b64ea1d4727\"},\"headline\":\"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales\",\"datePublished\":\"2026-10-26T08:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/\"},\"wordCount\":2048,\"publisher\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"articleSection\":[\"Noticias\",\"Tecnolog\u00eda\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/\",\"url\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/\",\"name\":\"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"datePublished\":\"2026-10-26T08:00:00+00:00\",\"description\":\"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"contentUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"width\":1024,\"height\":576,\"caption\":\"Ilustraci\u00f3n del Strategy Pattern en Symfony con diferentes estrategias conectadas a una aplicaci\u00f3n.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wata.es\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/wata.es\\\/es\\\/\",\"name\":\"WATA Factory\",\"description\":\"IT Consulting &amp; Outsourcing for your company\",\"publisher\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wata.es\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#organization\",\"name\":\"WATA Factory\",\"url\":\"https:\\\/\\\/wata.es\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/logowata.png\",\"contentUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/logowata.png\",\"width\":688,\"height\":176,\"caption\":\"WATA Factory\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/watafactory\\\/\",\"https:\\\/\\\/x.com\\\/watafactory\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/wata\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wata.es\\\/es\\\/#\\\/schema\\\/person\\\/2fe4cf3f05ff348d077f2b64ea1d4727\",\"name\":\"Victor Galo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"caption\":\"Victor Galo\"},\"url\":\"https:\\\/\\\/wata.es\\\/es\\\/author\\\/v-galowata-es\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory","description":"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/","og_locale":"es_ES","og_type":"article","og_title":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory","og_description":"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.","og_url":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/","og_site_name":"WATA Factory","article_publisher":"https:\/\/www.facebook.com\/watafactory\/","article_published_time":"2026-10-26T08:00:00+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","type":"image\/webp"}],"author":"Victor Galo","twitter_card":"summary_large_image","twitter_creator":"@watafactory","twitter_site":"@watafactory","twitter_misc":{"Escrito por":"Victor Galo","Tiempo de lectura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#article","isPartOf":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/"},"author":{"name":"Victor Galo","@id":"https:\/\/wata.es\/es\/#\/schema\/person\/2fe4cf3f05ff348d077f2b64ea1d4727"},"headline":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales","datePublished":"2026-10-26T08:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/"},"wordCount":2048,"publisher":{"@id":"https:\/\/wata.es\/es\/#organization"},"image":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#primaryimage"},"thumbnailUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","articleSection":["Noticias","Tecnolog\u00eda"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/","url":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/","name":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales - WATA Factory","isPartOf":{"@id":"https:\/\/wata.es\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#primaryimage"},"image":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#primaryimage"},"thumbnailUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","datePublished":"2026-10-26T08:00:00+00:00","description":"Cu\u00e1ndo usar Strategy Pattern en Symfony, c\u00f3mo implementarlo y qu\u00e9 ventajas aporta en proyectos reales.","breadcrumb":{"@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#primaryimage","url":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","contentUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","width":1024,"height":576,"caption":"Ilustraci\u00f3n del Strategy Pattern en Symfony con diferentes estrategias conectadas a una aplicaci\u00f3n."},{"@type":"BreadcrumbList","@id":"https:\/\/wata.es\/es\/strategy-pattern-en-symfony-cuando-usarlo-y-casos-de-uso-reales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wata.es\/es\/"},{"@type":"ListItem","position":2,"name":"Strategy Pattern en Symfony: cu\u00e1ndo usarlo y casos de uso reales"}]},{"@type":"WebSite","@id":"https:\/\/wata.es\/es\/#website","url":"https:\/\/wata.es\/es\/","name":"WATA Factory","description":"IT Consulting &amp; Outsourcing for your company","publisher":{"@id":"https:\/\/wata.es\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wata.es\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/wata.es\/es\/#organization","name":"WATA Factory","url":"https:\/\/wata.es\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/wata.es\/es\/#\/schema\/logo\/image\/","url":"https:\/\/wata.es\/wp-content\/uploads\/2019\/12\/logowata.png","contentUrl":"https:\/\/wata.es\/wp-content\/uploads\/2019\/12\/logowata.png","width":688,"height":176,"caption":"WATA Factory"},"image":{"@id":"https:\/\/wata.es\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/watafactory\/","https:\/\/x.com\/watafactory","https:\/\/www.linkedin.com\/company\/wata\/"]},{"@type":"Person","@id":"https:\/\/wata.es\/es\/#\/schema\/person\/2fe4cf3f05ff348d077f2b64ea1d4727","name":"Victor Galo","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","caption":"Victor Galo"},"url":"https:\/\/wata.es\/es\/author\/v-galowata-es\/"}]}},"_links":{"self":[{"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/posts\/17267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/users\/45"}],"replies":[{"embeddable":true,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/comments?post=17267"}],"version-history":[{"count":4,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/posts\/17267\/revisions"}],"predecessor-version":[{"id":17308,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/posts\/17267\/revisions\/17308"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/media\/17273"}],"wp:attachment":[{"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/media?parent=17267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/categories?post=17267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wata.es\/es\/wp-json\/wp\/v2\/tags?post=17267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}