Modello di Progettazione Strategica in Java – Tutorial con Esempi

La strategia del design è uno dei pattern di design comportamentale. Il pattern di strategia viene utilizzato quando abbiamo più algoritmi per un compito specifico e il cliente decide l’implementazione effettiva da utilizzare durante l’esecuzione.

Pattern di Strategia

Il pattern di strategia è anche conosciuto come Pattern di Politica. Definiamo diversi algoritmi e consentiamo all’applicazione client di passare l’algoritmo da utilizzare come parametro. Uno dei migliori esempi del pattern di strategia è il metodo Collections.sort() che prende il parametro Comparator. In base alle diverse implementazioni delle interfacce Comparator, gli oggetti vengono ordinati in modi diversi. Per il nostro esempio, cercheremo di implementare un semplice Carrello della Spesa in cui abbiamo due strategie di pagamento: utilizzare la carta di credito o utilizzare PayPal. Innanzitutto, creeremo l’interfaccia per il nostro esempio di pattern di strategia, nel nostro caso per pagare l’importo passato come argomento. PaymentStrategy.java

package com.journaldev.design.strategy;

public interface PaymentStrategy {

	public void pay(int amount);
}

Ora dovremo creare un’implementazione concreta degli algoritmi per il pagamento con carta di credito/debito o attraverso 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.");
	}

}

Ora i nostri algoritmi di esempio per il pattern strategy sono pronti. Possiamo implementare il carrello della spesa e il metodo di pagamento richiederà l’input come strategia di pagamento. 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 di articoli
	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);
	}
}

Nota che il metodo di pagamento del carrello della spesa richiede l’algoritmo di pagamento come argomento e non lo memorizza da nessuna parte come variabile di istanza. Testiamo la nostra configurazione di esempio del pattern strategy con un semplice programma. 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);
		
		//pagare con paypal
		cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
		
		//pagare con carta di credito
		cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
	}

}

Output del programma precedente è:

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

Diagramma delle Classi del Pattern Design Strategy

Punti Importanti del Pattern Design Strategy

  • Avremmo potuto utilizzare la composizione per creare una variabile di istanza per le strategie, ma dovremmo evitarlo poiché vogliamo che la strategia specifica venga applicata per una particolare attività. Lo stesso principio è seguito nei metodi Collections.sort() e Arrays.sort() che prendono un comparatore come argomento.
  • Il pattern Strategy è molto simile al pattern State. Una delle differenze è che il contesto contiene lo stato come variabile di istanza e ci possono essere più attività le cui implementazioni possono dipendere dallo stato, mentre nel pattern strategy la strategia viene passata come argomento al metodo e l’oggetto di contesto non ha alcuna variabile per memorizzarla.
  • Il pattern Strategy è utile quando abbiamo più algoritmi per una specifica attività e vogliamo che la nostra applicazione sia flessibile nella scelta di uno qualsiasi degli algoritmi durante l’esecuzione per una specifica attività.

Questo è tutto per il pattern Strategy in Java, spero ti sia piaciuto.

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