首頁  >  文章  >  Java  >  不要再使用 if-else 塊了!結合使用策略和工廠模式

不要再使用 if-else 塊了!結合使用策略和工廠模式

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-19 06:08:31620瀏覽

Don’t use if-else blocks anymore! Use Strategy and Factory Pattern Together

當我們在專案中前進時,迷失在 if-else 區塊中,在複雜的條件和重複的程式碼中掙扎,我們尋找解決方案。但為什麼我們要陷入 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 方塊了!一起使用策略和工廠模式

以上是不要再使用 if-else 塊了!結合使用策略和工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn