阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈

當我們在專案中前進時,迷失在 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 方塊了!策略和工廠模式結合使用


原文出處:https://dev.to/tamerardal/dont-use-if-else-blocks-anymore-use-strategy-and-factory-pattern-together-4i77

按讚的人:

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。

阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈