Java中的策略設計模式 – 示例教程

策略設計模式是一種行為設計模式之一。當我們有多個用於特定任務的算法時,策略模式用於在運行時由客戶端決定實際使用的實現。

策略模式

策略模式也被稱為策略模式。我們定義多個算法,並讓客戶端應用將算法作為參數傳遞。策略模式的一個最好的例子是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