design-patterns - strategy - template pattern
¿Cuál es la diferencia entre el patrón del puente y el patrón de estrategia? (13)
El patrón de estrategia se usa para las decisiones de comportamiento, mientras que el patrón de puente se usa para las decisiones estructurales.
Brigde Pattern separa los elementos abstractos de los detalles de implementación, mientras que Strategy Pattern se ocupa de hacer que los algoritmos sean más intercambiables.
Patrón de estrategia en Swift:
protocol PrintStrategy {
func print(_ string: String) -> String
}
class Printer {
let strategy: PrintStrategy
init(strategy: PrintStrategy) {
self.strategy = strategy
}
func print(_ string: String) -> String {
return self.strategy.print(string)
}
}
class UpperCaseStrategy: PrintStrategy {
internal func print(_ string: String) -> String {
return string.uppercased()
}
}
class LowerCaseStrategy: PrintStrategy {
internal func print(_ string: String) -> String {
return string.lowercased()
}
}
var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")
var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")
Patrón de Brigde en Swift:
protocol Appliance {
func run()
}
protocol Switch {
let appliance: Appliance {get set}
func turnOn()
}
class RemoteControl: Switch {
var appliance: Appliance
init(appliance: Appliance) {
self.appliance = appliance
}
internal func turnOn() {
appliance.run()
}
}
class TV: Appliance {
internal func run() {
print("TV is ON")
}
}
class Stereo: Appliance {
internal func run() {
print("Stereo is ON")
}
}
var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()
var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()
Intenté leer muchos artículos sobre dofactory, wikipedia y muchos sitios. No tengo idea de las diferencias entre el patrón del puente y el patrón de estrategia.
Sé que ambos desacoplan una abstracción de su implementación y pueden cambiar la implementación en tiempo de ejecución.
Pero todavía no sé en qué situación debería usar la estrategia o en qué situación debería usar bridge.
Añadiendo a la respuesta de willcodejavaforfood, pueden ser los mismos, en implementación. Sin embargo, utiliza la estrategia para intercambiar estrategias, como la estrategia de clasificación, mientras usa bridge para conectar las implementaciones de dos objetos, por ejemplo, un contenedor de base de datos y un adaptador de red para que el código cliente pueda funcionar contra la misma API. Entonces el nombre lo dice todo
Creo que hay una pequeña diferencia entre ellos en el contexto en que se usan.
Utilizo el patrón Bridge para separar los conceptos ortogonales que pertenecen a uno más grande, para que puedan variar de forma independiente. Usualmente involucra múltiples abstracciones.
IMO, el patrón de Estrategia es más simple o más plano. Sirve para OCP con seguridad, pero no necesariamente es parte de otro concepto más grande como el patrón Bridge.
Del wiki en el patrón de wikipedia
El diagrama de clase UML para el patrón de Estrategia es el mismo que el diagrama para el patrón Puente. Sin embargo, estos dos patrones de diseño no son lo mismo en su intención. Si bien el patrón de Estrategia está diseñado para el comportamiento, el patrón del Puente está destinado a la estructura.
El acoplamiento entre el contexto y las estrategias es más estricto que el acoplamiento entre la abstracción y la implementación en el patrón Bridge.
El patrón Bridge es un patrón estructural (¿CÓMO CONSTRUIR UN COMPONENTE DE SOFTWARE?). El patrón de Estrategia es un patrón dinámico (¿CÓMO QUIERES EJECUTAR UN COMPORTAMIENTO EN SOFTWARE?).
La sintaxis es similar pero los objetivos son diferentes:
- Estrategia : tienes más formas de hacer una operación; con la estrategia, puede elegir el algoritmo en tiempo de ejecución y puede modificar una sola estrategia sin muchos efectos secundarios en tiempo de compilación;
- Bridge : puedes dividir la jerarquía de la interfaz y la clase, unirla a una referencia abstracta (ver explication )
El patrón de estrategia se usa cuando desea conectar algoritmo o estrategia en tiempo de ejecución. Como categoría de patrón también implica que se trata del comportamiento de los objetos. Por otro lado, bridge es un patrón estructural y se ocupa de la jerarquía estructural de los objetos. Desvincula la abstracción de la implementación al introducir una abstracción refinada entre ellos. La abstracción refinada se puede confundir con la estrategia de tiempo de ejecución tapada (en el patrón de Estrategia). El patrón de puente trata los aspectos estructurales al proporcionar un mecanismo para evitar crear n cantidad de clases.
Estaba pensando lo mismo, pero recientemente tuve que usar Bridge y me di cuenta de que Bridge usa la estrategia y agrega abstracción al contexto para que luego pueda hacer más cambios sin cambiar el cliente. Al usar la estrategia sin la abstracción, el diseño no es tan flexible y puede requerir cambios en el cliente más adelante. Pero cuando se usa todo el puente, el diseño se vuelve aún más flexible. Aquí puede ver cómo pasar de Estrategia a Puente le da más flexibilidad. También asumimos que ahora "visa" y "master" no solo están disponibles en las tarjetas sino también en teléfonos y chips; y si usamos Bridge es mucho más fácil agregar ese soporte.
Para el patrón de estrategia, solo la implementación varía.
Supongamos que la clase A está utilizando la clase B, que tiene implementaciones múltiples disponibles. Entonces, en ese caso B sería abstracto con la implementación real provista en tiempo de ejecución. Este es un patrón de estrategia
Ahora bien, si A es abstracto. Tanto A como B pueden variar. Utilizarías el patrón Bridge.
Semántica. De la wikipedia :
El diagrama de clase UML para el patrón de Estrategia es el mismo que el diagrama para el patrón Puente. Sin embargo, estos dos patrones de diseño no son lo mismo en su intención. Si bien el patrón de Estrategia está diseñado para el comportamiento, el patrón del Puente está destinado a la estructura.
El acoplamiento entre el contexto y las estrategias es más estricto que el acoplamiento entre la abstracción y la implementación en el patrón Bridge.
Tal como lo entiendo, estás usando el patrón de estrategia cuando estás abstrayendo el comportamiento que podría proporcionarse desde una fuente externa (por ejemplo, config podría especificar cargar algún ensamblaje de complemento), y estás usando el patrón de puente cuando usas las mismas construcciones para hacer que tu código sea un poco más ordenado. El código real se verá muy similar; solo está aplicando los patrones por razones ligeramente diferentes.
Solo para agregar a lo que ya se ha dicho sobre la comparación de patrones (diferencia de intención, ...): el patrón de Puente también está intencionalmente estructurado para permitir que el lado de la jerarquía de abstracción varíe. En idiomas como C #, esto podría implicar que tiene una base de abstracción que contiene métodos virtuales como una forma de permitir las variaciones previstas que no causan problemas a los consumidores existentes. Aparte de eso, los dos patrones pueden parecer idénticos en su mayor parte.
Estrategia:
- Contexto vinculado a la estrategia: la clase de contexto (posiblemente abstracta pero no realmente una interfaz, ya que desea encapsular un comportamiento específico y no toda la implementación) conocería / contendría la referencia de la interfaz de estrategia y la implementación para invocar el comportamiento de la estrategia en eso.
El intento es la capacidad de intercambiar el comportamiento en tiempo de ejecución
class Context { IStrategy strategyReference; void strategicBehaviour() { strategyReference.behave(); } }
Puente
- Abstracción no vinculada a la implementación: la interfaz de abstracción (o clase abstracta con la mayor parte del resumen de comportamiento) no conocería / contendría la referencia de la interfaz de implementación
El propósito es desacoplar por completo la abstracción de la implementación
interface IAbstraction { void behaviour1(); ..... } interface IImplementation { void behave1(); void behave2(); ..... } class ConcreteAbstraction1 implements IAbstraction { IImplementation implmentReference; ConcreteAbstraction1() { implmentReference = new ImplementationA() // Some implementation } void behaviour1() { implmentReference.behave1(); } ............. } class ConcreteAbstraction2 implements IAbstraction { IImplementation implmentReference; ConcreteAbstraction1() { implmentReference = new ImplementationB() // Some Other implementation } void behaviour1() { implmentReference.behave2(); } ............. }
Puente : (Un patrón estructural)
El patrón de puente desacopla la abstracción y la implementación y permite que ambos varíen de forma independiente.
Use este patrón cuando:
- Las abstracciones y las implementaciones no se han decidido en tiempo de compilación
- Las abstracciones y las implementaciones se deben cambiar de forma independiente
- Los cambios en la implementación de la abstracción no deberían afectar la aplicación del llamante
- El cliente debe estar aislado de los detalles de implementación.
Estrategia: (Patrón de comportamiento)
Los patrones de estrategia le permiten alternar entre múltiples algoritmos de una familia de algoritmos en tiempo de ejecución.
Utilice el patrón de estrategia cuando:
- Se requieren múltiples versiones de algoritmos
- El comportamiento de la clase debe cambiarse dinámicamente en el tiempo de ejecución
- Evitar declaraciones condicionales
Artículos Relacionados:
¿Cuándo usas el patrón de puente? ¿Cómo es diferente del patrón del Adaptador?
Diseñar tipos de patrones
- Comportamiento: los patrones caracterizan las formas en que las clases u objetos interactúan y distribuyen la responsabilidad
- Estructurales: los patrones se refieren a la composición de clases u objetos.
- Creacional: los patrones están preocupados por el proceso de creación de objetos.
Bridge (Estructural)
Desacople una abstracción de su implementación para que cada una pueda variar. independientemente.
Toma un control remoto. El control remoto tiene los botones 1-6. Esta es la clase concreta en el diagrama de arriba. Cada botón funcionará diferente dependiendo de si el control remoto se usa para un televisor o DVD. La funcionalidad de cada botón se abstrae de la implementación mediante la interfaz del implementador.
Esto nos permite cambiar cómo funcionará el control remoto para cada dispositivo.
Strategy (Comportamiento)
Define una familia de algoritmos, encapsula cada uno y haz que sean intercambiables.
En estrategia, si estuviéramos mirando el escenario remoto. El "estado" es el control remoto completo que cambiamos al cambiar la referencia de estado del contexto. El "concreteStateA" (control remoto de TV) "concreteStateB" (DVD Remote).
Lectura adicional: