[英]Implement strategy pattern with enum
我正在嘗試創建一項服務來處理不同的付款方式。 我想實施策略模式。 我想要一個具有不同付款方式的枚舉。 這是我所擁有的一個例子:
public enum Pay {
CREDITCARD(1) {
@Override
public void pay() {
System.out.println("Payment functionality");
}
},
OTHERMETHOD(2) {
@Override
public void pay() {
System.out.println("Payment functionality");
}
};
private int id;
Payment(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public abstract void pay();
}
客戶端某處:
user.setPay(Pay.CREDITCARD);
user.pay();
這種方法的問題是“支付”方法可能有很多邏輯,所以我想把它放在不同的 class 中。 我可以定義這樣的接口:
public interface Pay {
void pay();
}
public class CreditCard implements Pay {
@Override
public void pay() {
}
}
public class OtherMethod implements Pay {
@Override
public void pay() {
}
}
客戶端某處:
if (method.equals("creditcard")) {
user.setPay(new CreditCard());
user.pay();
}
else {
user.setPay(new OtherMethod());
user.pay();
}
但我更喜歡 Enum 的外觀以及保持這種方式的原因。 謝謝
我不建議在枚舉中實現邏輯,因為您可能需要調用外部服務來實現支付,因此您希望能夠在支付實現中注入這些依賴項。 枚舉是靜態初始化的,它們對注入一點也不友好。 可以將一些邏輯放入枚舉中,盡管它們通常應該在很大程度上保持簡單數據,但這種情況似乎過於復雜,無法在枚舉中處理。 如果需要,您可以使用枚舉來決定支付類型,然后將每個枚舉項映射到支付實現的 singleton,但邏輯應該與枚舉分離。
您不需要客戶端中的 if 語句。 如果您使用Pay
類型的參數(接口)聲明 set Pay,則可以通過每個實現 Pay 接口的 class 來調用它。 你的代碼變成了
user.setPay(new CreditCard()); //or every class which implements Pya interface
user.pay();
在這種情況下,枚舉是無用的。 如果您想為每種付款方式提供一個數字 ID,請將其添加到界面中。
可以這樣開發
public enum PayType {
CREDITCARD(new CreditCard()),
OTHER(new OtherMethod();
private Pay pay;
PayType(Pay pay) {
this.pay = pay;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.