策略設計模式是一種行為設計模式之一。當我們有多個用於特定任務的算法時,策略模式用於在運行時由客戶端決定實際使用的實現。
策略模式
策略模式也被稱為策略模式。我們定義多個算法,並讓客戶端應用將算法作為參數傳遞。策略模式的一個最好的例子是
Collections.sort()
方法,該方法接受Comparator參數。根據Comparator接口的不同實現,對象以不同的方式進行排序。對於我們的例子,我們將嘗試實現一個簡單的購物車,其中有兩種支付策略-使用信用卡或使用PayPal。首先,我們將為策略模式的示例創建接口,即支付傳遞的金額。 PaymentStrategy.java
package com.journaldev.design.strategy;
public interface PaymentStrategy {
public void pay(int amount);
}
現在,我們將不得不創建使用信用卡/借記卡或通過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.");
}
}
現在我們的策略模式示例算法已經準備好了。我們可以實現購物車,並且付款方式將需要作為付款策略的輸入。 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 {
//物品列表
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);
}
}
請注意,購物車的付款方式需要支付算法作為參數,並且不將其存儲在任何地方作為實例變量。讓我們用一個簡單的程序來測試我們的策略模式示例設置。 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);
//使用PayPal支付
cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
//使用信用卡支付
cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
}
}
上述程序的輸出為:
50 paid using Paypal.
50 paid with credit/debit card
策略設計模式類圖
策略設計模式的重點
- 我們本可以使用組合來為策略創建實例變量,但我們應該避免這樣做,因為我們希望特定策略應用於特定任務。在Collections.sort()和Arrays.sort()方法中也遵循相同的原則,這些方法接受比較器作為參數。
- 策略模式非常類似於狀態模式。其中一個區別是上下文包含狀態作為實例變量,並且可能有多個任務,其實現可能取決於狀態,而在策略模式中,策略作為參數傳遞給方法,並且上下文對象沒有任何變量來存儲它。
- 當我們對特定任務有多個算法,並且希望我們的應用程序在運行時選擇任何算法來執行特定任務時,策略模式非常有用。
這就是 Java 中的策略模式,希望你喜歡。
Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial