Strategy Pattern 重構 switch-case 語法

文章最後更新於 2023 年 3 月 27 日

Switch case block是一種常見的編程結構,通常用於根據不同的情況執行不同的代碼。然而,當情況增加時,switch case block變得冗長且難以維護。為了解決這個問題,可以使用Strategy Pattern來重構switch case block。

Strategy Pattern是一種行為型設計模式,它允許您在運行時選擇算法的行為。在這種模式中,您可以創建一個策略接口,該接口定義了所有支持的算法,並且有多個實現該接口的類,每個類實現一個算法。

首先,讓我們看一下如何使用switch case block來執行四個數學操作:加法,減法,乘法和除法。

public int calculate(String operation, int a, int b) {
    int result = 0;
    switch (operation) {
        case "add":
            result = a + b;
            break;
        case "subtract":
            result = a - b;
            break;
        case "multiply":
            result = a * b;
            break;
        case "divide":
            result = a / b;
            break;
        default:
            throw new IllegalArgumentException("Invalid operation: " + operation);
    }
    return result;
}

在上面的代碼中,我們使用switch case block來根據傳入的operation參數來決定執行哪個操作。但是,如果您想添加新的操作,您需要修改calculate方法,這會導致代碼變得難以維護和擴展。

現在,讓我們使用Strategy Pattern來重構calculate方法。首先,我們需要創建一個名為MathOperation的策略接口:

public interface MathOperation {
    int execute(int a, int b);
}

該接口定義了一個execute方法,該方法接受兩個int參數a和b,並返回一個int值。接下來,我們需要創建四個實現MathOperation接口的類,每個類實現一個算法:

public class AddOperation implements MathOperation {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

public class SubtractOperation implements MathOperation {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

public class MultiplyOperation implements MathOperation {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

public class DivideOperation implements MathOperation {
    @Override
    public int execute(int a, int b) {
        return a / b;
    }
}

現在,我們可以使用MathOperation接口及其實現類來重構calculate方法。我們可以創建一個HashMap來存儲每個操作的名稱和相應的MathOperation對象。在執行calculate方法時,我們只需要在HashMap中查找傳入的操作名稱,並調用對應的MathOperation對象的execute方法即可。

public class Calculator {
    private final Map<String, MathOperation> operations = new HashMap<>();

    public Calculator() {
        operations.put("add", new AddOperation());
        operations.put("subtract", new SubtractOperation());
        operations.put("multiply", new MultiplyOperation());
        operations.put("divide", new DivideOperation());
    }

    public int calculate(String operation, int a, int b) {
        MathOperation mathOperation = operations.get(operation);
        if (mathOperation == null) {
            throw new IllegalArgumentException("Invalid operation: " + operation);
        }
        return mathOperation.execute(a, b);
    }
}

在上面的代碼中,我們在Calculator類的構造函數中創建了一個HashMap,該HashMap存儲了每個操作的名稱和對應的MathOperation對象。在calculate方法中,我們從HashMap中獲取相應的MathOperation對象,如果未找到對應的操作,我們會拋出IllegalArgumentException異常。

使用Strategy Pattern重構switch case block可以使代碼更加靈活和易於擴展。如果您需要添加新的操作,您只需要創建一個新的實現MathOperation接口的類即可。這種方法還可以使代碼更加可讀和易於維護,因為每個操作都是在其專有的類中實現的,並且每個類都有一個明確的責任。

關於作者

卡哥
卡哥
我是Oscar (卡哥),前Yahoo Lead Engineer、高智商同好組織Mensa會員,超過十年的工作經驗,服務過Yahoo關鍵字廣告業務部門、電子商務及搜尋部門,喜歡彈吉他玩音樂,也喜歡投資美股、虛擬貨幣,樂於與人分享交流!

如果對文章內容有任何問題,歡迎在底下留言讓我知道。
如果你喜歡我的文章,可以按分享按鈕,讓更多的人看見我的文章。

網友留言