Die Strategie-Designvorlage ist eine der Verhaltensdesignvorlagen. Die Strategievorlage wird verwendet, wenn wir mehrere Algorithmen für eine bestimmte Aufgabe haben und der Client zur Laufzeit über die tatsächliche Implementierung entscheidet.
Strategievorlage
Die Strategievorlage wird auch als Richtlinienvorlage bezeichnet. Wir definieren mehrere Algorithmen und lassen die Client-Anwendung den zu verwendenden Algorithmus als Parameter übergeben. Ein bestes Beispiel für die Strategievorlage ist die Methode
Collections.sort()
, die einen Comparator-Parameter verwendet. Basierend auf den verschiedenen Implementierungen der Comparator-Schnittstellen werden die Objekte auf unterschiedliche Weise sortiert. Für unser Beispiel werden wir versuchen, einen einfachen Einkaufswagen zu implementieren, in dem wir zwei Zahlungsstrategien haben – Zahlung mit Kreditkarte oder Zahlung mit PayPal. Zuerst erstellen wir die Schnittstelle für unser Strategievorlagenbeispiel, in unserem Fall zum Bezahlen des als Argument übergebenen Betrags. PaymentStrategy.java
package com.journaldev.design.strategy;
public interface PaymentStrategy {
public void pay(int amount);
}
Jetzt müssen wir konkrete Implementierungen von Algorithmen für die Zahlung mit Kredit- / Debitkarte oder über PayPal erstellen. 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.");
}
}
Jetzt sind unsere Strategiemuster-Beispielalgorithmen bereit. Wir können den Einkaufswagen implementieren, und die Zahlungsmethode erfordert eine Eingabe als Zahlungsstrategie. 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 der Artikel
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);
}
}
Beachten Sie, dass die Zahlungsmethode des Einkaufswagens einen Zahlungsalgorithmus als Argument erfordert und ihn nicht als Instanzvariable speichert. Lassen Sie uns unser Strategiemuster-Beispielsetup mit einem einfachen Programm testen. 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);
//Bezahlung per Paypal
cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
//Bezahlung per Kreditkarte
cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
}
}
Die Ausgabe des obigen Programms lautet:
50 paid using Paypal.
50 paid with credit/debit card
Strategie-Entwurfsmuster-Klassendiagramm
Wichtige Punkte des Strategie-Entwurfsmusters
- Wir hätten die Komposition verwenden können, um eine Instanzvariable für Strategien zu erstellen, aber das sollten wir vermeiden, da wir möchten, dass die spezifische Strategie für eine bestimmte Aufgabe angewendet wird. Das gleiche wird in der Methode Collections.sort() und Arrays.sort() befolgt, die einen Vergleicher als Argument nehmen.
- Das Zustandsmuster ist dem Strategiemuster sehr ähnlich. Ein Unterschied besteht darin, dass der Kontext den Zustand als Instanzvariable enthält und es mehrere Aufgaben geben kann, deren Implementierung vom Zustand abhängig sein kann. Im Strategiemuster wird die Strategie dagegen als Argument an die Methode übergeben und das Kontextobjekt hat keine Variable, um sie zu speichern.
- Das Strategiemuster ist nützlich, wenn wir mehrere Algorithmen für eine bestimmte Aufgabe haben und unsere Anwendung flexibel sein soll, um zur Laufzeit einen beliebigen Algorithmus für eine spezifische Aufgabe auszuwählen.
Das war alles zum Strategiemuster in Java. Ich hoffe, es hat Ihnen gefallen.
Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial