El patrón de diseño de estrategia es uno de los patrones de diseño conductuales. El patrón de estrategia se utiliza cuando tenemos múltiples algoritmos para una tarea específica y el cliente decide la implementación real que se utilizará en tiempo de ejecución.
Patrón de Estrategia
El patrón de estrategia también se conoce como Patrón de Política. Definimos múltiples algoritmos y permitimos que la aplicación del cliente pase el algoritmo a utilizar como parámetro. Uno de los mejores ejemplos del patrón de estrategia es el método
Collections.sort()
que toma un parámetro Comparator. Según las diferentes implementaciones de las interfaces Comparator, los objetos se ordenan de diferentes maneras. Para nuestro ejemplo, intentaremos implementar un carrito de compras simple donde tengamos dos estrategias de pago: usando tarjeta de crédito o usando PayPal. En primer lugar, crearemos la interfaz para nuestro ejemplo de patrón de estrategia, en nuestro caso, para pagar la cantidad pasada como argumento. PaymentStrategy.java
package com.journaldev.design.strategy;
public interface PaymentStrategy {
public void pay(int amount);
}
Ahora tendremos que crear la implementación concreta de algoritmos para el pago con tarjeta de crédito/débito o a través de PayPal. CreditCardStrategy.java
package com.journaldev.design.strategy;
public class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
this.name=nm;
this.cardNumber=ccNum;
this.cvv=cvv;
this.dateOfExpiry=expiryDate;
}
@Override
public void pay(int amount) {
System.out.println(amount +" paid with credit/debit card");
}
}
PaypalStrategy.java
package com.journaldev.design.strategy;
public class PaypalStrategy implements PaymentStrategy {
private String emailId;
private String password;
public PaypalStrategy(String email, String pwd){
this.emailId=email;
this.password=pwd;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using Paypal.");
}
}
Ahora nuestros algoritmos de ejemplo del patrón de estrategia están listos. Podemos implementar el Carrito de Compras y el método de pago requerirá la entrada como estrategia de pago. `Item.java
package com.journaldev.design.strategy;
public class Item {
private String upcCode;
private int price;
public Item(String upc, int cost){
this.upcCode=upc;
this.price=cost;
}
public String getUpcCode() {
return upcCode;
}
public int getPrice() {
return price;
}
}
ShoppingCart.java
package com.journaldev.design.strategy;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
//Lista de artículos
List- items;
public ShoppingCart(){
this.items=new ArrayList
- ();
}
public void addItem(Item item){
this.items.add(item);
}
public void removeItem(Item item){
this.items.remove(item);
}
public int calculateTotal(){
int sum = 0;
for(Item item : items){
sum += item.getPrice();
}
return sum;
}
public void pay(PaymentStrategy paymentMethod){
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
Observa que el método de pago del carrito de compras requiere el algoritmo de pago como argumento y no lo almacena en ninguna parte como variable de instancia. Probemos nuestra configuración de ejemplo del patrón de estrategia con un programa simple. `ShoppingCartTest.java
package com.journaldev.design.strategy;
public class ShoppingCartTest {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item item1 = new Item("1234",10);
Item item2 = new Item("5678",40);
cart.addItem(item1);
cart.addItem(item2);
//pagar por paypal
cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
//pagar por tarjeta de crédito
cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
}
}
La salida del programa anterior es:
50 paid using Paypal.
50 paid with credit/debit card
Diagrama de Clase del Patrón de Diseño de Estrategia
Puntos Importantes del Patrón de Diseño de Estrategia
- Podríamos haber utilizado la composición para crear una variable de instancia para las estrategias, pero debemos evitar eso ya que queremos que la estrategia específica se aplique para una tarea particular. Lo mismo se sigue en el método Collections.sort() y Arrays.sort() que toman un comparador como argumento.
- El patrón de estrategia es muy similar al Patrón de Estado. Una de las diferencias es que el Contexto contiene el estado como variable de instancia y puede haber múltiples tareas cuya implementación puede depender del estado, mientras que en el patrón de estrategia, la estrategia se pasa como argumento al método y el objeto de contexto no tiene ninguna variable para almacenarla.
- El patrón de estrategia es útil cuando tenemos múltiples algoritmos para una tarea específica y queremos que nuestra aplicación sea flexible para elegir cualquiera de los algoritmos en tiempo de ejecución para una tarea específica.
Eso es todo para el Patrón de Estrategia en Java, espero que te haya gustado.
Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial