Java 戦略パターン - コード内の多数の if...else の代わりに

開発プロセス中、条件分岐は多くのビジネス シナリオで使用されます。if...else は、Java が提供する従来の分岐処理の実装です。たとえば、足し算、引き算、掛け算、割り算を例にとると、伝統的な書き方は次のようになります。


public void arithmetic(@RequestParam(value = "arithmeticType") String arithmeticType,
                             @RequestParam(value = "startNum") int startNum,
                             @RequestParam(value = "endNum") int endNum) {
 
        double result = 0.0;
        if (arithmeticType.equals("addition")) {
            result = startNum + endNum;
        } else if (arithmeticType.equals("subtraction")) {
            result = startNum - endNum;
        } else if (arithmeticType.equals("multiplication")) {
            result = startNum * endNum;
        } else {
            result = startNum / endNum;
        }
        System.out.println("====================>" + result);

  }
しかし、実際のビジネス シナリオはこれら 4 つよりも多くなければならず、条件がますます多くなるにつれて、コードは非常に肥大化し、保守が困難になります。
このアプローチも、開閉原理に準拠していません。

リファクタリング: 以下の戦略パターンを使用してコードをリファクタリングします

インターフェース クラスを作成します: BaseHandler
import org.springframework.stereotype.Component;

@Component
public interface BaseHandler {
    double arithmetic(int startNum, int endNum);
}

足し算、引き算、掛け算の4業務に対応したインターフェース実装クラスを作成
/*加法*/
@Component("addition")
public class AdditionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum + endNum;
    }
}


/*减法*/
@Component("division")
public class DivisionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum / endNum;
    }
}


/*乘法*/
@Component("multiplication")
public class multiplicationHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum * endNum;
    }
}


/*除法*/
@Component("subtraction")
public class SubtractionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum - endNum;
    }
}

コントローラ クラス コード、@Autowired を使用して BaseHandler を注入
@RestController
@RequestMapping("action")
public class SpringTestController {

    @Autowired
    private Map<String, BaseHandler> handlerMap;

    @GetMapping("/handler")
    public void arithmetic(@RequestParam(value = "arithmeticType") String arithmeticType,
                           @RequestParam(value = "startNum") int startNum,
                           @RequestParam(value = "endNum") int endNum){
        BaseHandler baseHandler = handlerMap.get(arithmeticType);
        double result = baseHandler.arithmetic(startNum, endNum);
        System.out.println("===========>" + result);
    }
}

@component アノテーションは、構成ファイルの <bean id="", class=""/> に相当する Spring コンテナーに通常の pojo をインスタンス化し、プロジェクトの開始時に handlerMap にロードします。

要約する

  1. @component はすべての Bean をマップ形式である Spring にインスタンス化し、@component アノテーションの属性値がマップのキーになります。

  1. 設計パターンを完全に使用すると、多数の if...else が回避され、コードが簡潔に見え、後で拡張および保守するのに便利です。

  1. 後期の新規事業は、自分のビジネスポイントだけに集中すればよく、論理的な判断を加える必要はありません。

  1. 欠点は、多くの実装クラスを作成する必要があることです。


参考リンク:https://blog.csdn.net/XIAO_4510123/article/details/105272695?spm=1001.2101.3001.6650.12&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-12-695527 -blog-116993087.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-12-105272695-blog-116993087.pc_relevant_3mothn_strategy_and_data_recovery&utm_recovery&utm_recovery&utm_20

おすすめ

転載: blog.csdn.net/A_captain_608/article/details/129090502