當我們在專案中前進時,迷失在 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 Mapstrategies = 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 方塊了!策略和工廠模式結合使用
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3