當我們在專案中前進時,迷失在 if-else 區塊中,在複雜的條件和重複的程式碼中掙扎,我們尋找解決方案。但為什麼我們要陷入 if-else 區塊呢?在本文中,我們將結合策略模式和工廠模式來探索消除 if-else 混亂的方法。
假設您正在開發一個電子商務應用程式,並且需要支援不同的付款方式,例如信用卡、金融卡和加密貨幣。您從 if-else 區塊開始處理付款:
public class PaymentService {
public void processPayment(String paymentType) {
if (paymentType.equals("CREDIT_CARD")) {
System.out.println("Processing credit card payment...");
} else if (paymentType.equals("DEBIT_CARD")) {
System.out.println("Processing debit card payment...");
} else if (paymentType.equals("CRYPTO")) {
System.out.println("Processing crypto payment...");
} else {
throw new IllegalArgumentException("Invalid payment type");
}
}
}
雖然一開始看起來很簡單,但隨著支付方式的增加,if-else 的複雜性也會增加。新的支付方式意味著增加新的條件。結果就是一堆難以管理的程式碼。而這種方法是違反開閉原則的。
但是,我們可以使用策略模式和工廠模式來解決這個問題。
首先,讓我們建立一個枚舉:
public enum PaymentType {
CREDIT_CARD,
DEBIT_CARD,
CRYPTO
}
public interface PaymentStrategy {
void pay(PaymentRequest request);
}
public class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(PaymentRequest request) {
System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
}
}
public class DebitCardPayment implements PaymentStrategy {
@Override
public void pay(PaymentRequest request) {
System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
}
}
public class CryptoPayment implements PaymentStrategy {
@Override
public void pay(PaymentRequest request) {
System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
}
}
在此階段,透過通用介面實現每種支付方式的單獨策略。現在,透過工廠模式,我們將決定選擇哪種策略。
在這一步驟中,我們可以使用 EnumMap 使工廠模式更加清晰和最佳化。
public class PaymentFactory {
private static final Map<PaymentType, PaymentStrategy> strategies = new EnumMap<>(PaymentType.class);
static {
strategies.put(PaymentType.CREDIT_CARD, new CreditCardPayment());
strategies.put(PaymentType.DEBIT_CARD, new DebitCardPayment());
strategies.put(PaymentType.CRYPTO, new CryptoPayment());
}
public static PaymentStrategy getPaymentStrategy(PaymentType paymentType) {
PaymentStrategy strategy = strategies.get(paymentType);
if (Objects.isNull(strategy))
throw new IllegalArgumentException("Strategy not found");
return strategy;
}
}
現在,讓我們使用我們所做的。
public class PaymentService {
public void processPayment(PaymentRequest request) {
// Don't forget to check objects if null!
if (Objects.isNull(request) || Objects.isNull(request.getPaymentType())
throw new IllegalArgumentException("Request can not be null!");
PaymentStrategy strategy = PaymentFactory.getPaymentStrategy(request.getPaymentType());
strategy.pay(request);
}
}
事實上,我們不需要任何 if-else 區塊來進行支付處理。感謝策略和工廠模式,我們的程式碼更加乾淨、模組化和可擴展。
1.可擴充性:新增新的支付方式只需要一個新的類別和幾行程式碼。
2. 可讀性:透過使用策略和工廠而不是 if-else 區塊,可以使程式碼更易於理解和管理。
3.可維護性:透過策略和工廠模式,可以對程式碼進行更改,而不會影響其他程式碼。
如果您正在處理一個不斷增長的專案,則不應使用 if-else 區塊。策略和工廠模式是使您的程式碼更簡潔、模組化和可維護的完美解決方案。
正如您在本文中所看到的,使用設計模式而不是 if-else 區塊來管理支付交易使專案更具可開發性並提高了程式碼的可讀性。在下一個專案中嘗試這些模式,而不是使用 if-else 區塊。
感謝您閱讀我的文章!如果您有任何問題、反饋或想法想要分享,我很樂意在評論中聽到它們。
您可以在 dev.to 上關注我,以獲取有關此主題和我的其他帖子的更多資訊。
謝謝!
想在 LinkedIn 上關注我:https://www.linkedin.com/in/tamerardal/
Medium: 不要再使用 if-else 方塊了!策略和工廠模式結合使用