Modèle de conception de stratégie en Java – Tutoriel avec exemple

Le motif de conception de la stratégie est l’un des patterns de conception comportementaux. Le motif de stratégie est utilisé lorsque nous avons plusieurs algorithmes pour une tâche spécifique et que le client décide de l’implémentation réelle à utiliser à l’exécution.

Pattern de Stratégie

Le motif de stratégie est également connu sous le nom de Pattern de Politique. Nous définissons plusieurs algorithmes et laissons l’application cliente transmettre l’algorithme à utiliser en tant que paramètre. Un des meilleurs exemples du motif de stratégie est la méthode Collections.sort() qui prend un paramètre Comparator. En fonction des différentes implémentations des interfaces Comparator, les objets sont triés de différentes manières. Pour notre exemple, nous allons essayer de mettre en œuvre un panier d’achats simple où nous avons deux stratégies de paiement – utiliser une carte de crédit ou utiliser PayPal. Tout d’abord, nous allons créer l’interface pour notre exemple de motif de stratégie, dans notre cas pour payer le montant transmis en tant qu’argument. PaymentStrategy.java

package com.journaldev.design.strategy;

public interface PaymentStrategy {

	public void pay(int amount);
}

Maintenant, nous devrons créer une implémentation concrète des algorithmes de paiement par carte de crédit/débit ou via 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.");
	}

}

Maintenant, nos algorithmes d’exemple de modèle de stratégie sont prêts. Nous pouvons implémenter le panier d’achat et la méthode de paiement nécessitera une entrée en tant que stratégie de paiement. 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 {

	//Liste des articles
	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);
	}
}

Remarquez que la méthode de paiement du panier d’achat nécessite un algorithme de paiement en tant qu’argument et ne le stocke nulle part en tant que variable d’instance. Testons notre exemple de configuration de modèle de stratégie avec un programme 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);
		
		//payer par paypal
		cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
		
		//payer par carte de crédit
		cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
	}

}

La sortie du programme ci-dessus est :

50 paid using Paypal.
50 paid with credit/debit card

Diagramme de classe du modèle de conception de stratégie

Points importants du modèle de conception de stratégie

  • Nous aurions pu utiliser la composition pour créer une variable d’instance pour les stratégies, mais nous devrions éviter cela car nous voulons que la stratégie spécifique soit appliquée pour une tâche particulière. Il en va de même dans les méthodes Collections.sort() et Arrays.sort() qui prennent un comparateur en tant qu’argument.
  • Le modèle de stratégie est très similaire au Modèle d’État. L’une des différences est que le Contexte contient l’état en tant que variable d’instance et qu’il peut y avoir plusieurs tâches dont l’implémentation peut dépendre de l’état, tandis que dans le modèle de stratégie, la stratégie est passée en argument à la méthode et l’objet contexte n’a pas de variable pour la stocker.
  • Le modèle de stratégie est utile lorsque nous avons plusieurs algorithmes pour une tâche spécifique et que nous voulons que notre application soit flexible pour choisir l’un des algorithmes à l’exécution pour une tâche spécifique.

C’est tout pour le modèle de stratégie en Java, j’espère que vous avez aimé.

Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial