Strategy ontwerppatroon is een van de gedragsontwerppatronen. Het Strategy patroon wordt gebruikt wanneer we meerdere algoritmes hebben voor een specifieke taak en de client besluit welke implementatie daadwerkelijk gebruikt wordt tijdens runtime.
Strategiepatroon
Het Strategy patroon staat ook bekend als het Beleidspatroon. We definiëren meerdere algoritmes en laten de client applicatie het algoritme als parameter doorgeven. Een van de beste voorbeelden van het Strategy patroon is de methode
Collections.sort()
die een Comparator parameter accepteert. Op basis van de verschillende implementaties van de Comparator interface worden de objecten op verschillende manieren gesorteerd. Voor ons voorbeeld zullen we proberen een eenvoudige winkelwagen te implementeren waarbij we twee betaalstrategieën hebben – betalen met een creditcard of betalen via PayPal. Allereerst zullen we de interface voor ons strategiepatroon voorbeeld maken, in ons geval om het bedrag dat als argument wordt doorgegeven te betalen. PaymentStrategy.java
package com.journaldev.design.strategy;
public interface PaymentStrategy {
public void pay(int amount);
}
Nu moeten we concrete implementaties maken van de algoritmes voor betaling met een creditcard/debetkaart of 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.");
}
}
Nu zijn onze voorbeeldalgoritmen voor het strategiepatroon klaar. We kunnen Winkelwagen implementeren en de betalingsmethode zal invoer als betalingsstrategie vereisen. 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 {
//Lijst van items
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);
}
}
Merk op dat de betalingsmethode van de winkelwagen een betalingsalgoritme vereist als argument en het nergens als instantievariabele opslaat. Laten we onze voorbeeldopstelling van het strategiepatroon testen met een eenvoudig 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);
//betalen met paypal
cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
//betalen met creditcard
cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
}
}
De uitvoer van bovenstaand programma is:
50 paid using Paypal.
50 paid with credit/debit card
Strategieontwerppatroonklassediagram
Belangrijke punten van het strategieontwerppatroon
- We hadden compositie kunnen gebruiken om een instantievariabele voor strategieën te maken, maar dat moeten we vermijden omdat we willen dat de specifieke strategie wordt toegepast voor een bepaalde taak. Hetzelfde geldt voor de methoden Collections.sort() en Arrays.sort() die een comparator als argument accepteren.
- Het Strategiepatroon is zeer vergelijkbaar met het Toestandspatroon. Een van de verschillen is dat de Context de toestand als instantievariabele bevat en er kunnen meerdere taken zijn waarvan de implementatie afhankelijk kan zijn van de toestand, terwijl in het strategiepatroon de strategie als argument aan de methode wordt doorgegeven en het contextobject geen variabele heeft om het op te slaan.
- Het strategiepatroon is nuttig wanneer we meerdere algoritmen hebben voor een specifieke taak en we willen dat onze toepassing flexibel is om op elk moment tijdens de uitvoering een van de algoritmen te kiezen voor een specifieke taak.
Dat is alles voor het Strategiepatroon in Java, ik hoop dat het je bevalt.
Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial