簡體   English   中英

使用枚舉實現策略模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM