開発プロセス中、条件分岐は多くのビジネス シナリオで使用されます。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 にロードします。
要約する
@component はすべての Bean をマップ形式である Spring にインスタンス化し、@component アノテーションの属性値がマップのキーになります。
設計パターンを完全に使用すると、多数の if...else が回避され、コードが簡潔に見え、後で拡張および保守するのに便利です。
後期の新規事業は、自分のビジネスポイントだけに集中すればよく、論理的な判断を加える必要はありません。
欠点は、多くの実装クラスを作成する必要があることです。
参考リンク: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