在Spring Boot項目開發中,常常會遇到根據不同的業務場景執行不同邏輯的需求,策略模式就是一種很好的設計模式來應對這種情況。同時,Spring Boot強大的依賴注入機制可以方便地將不同的策略類進行管理和調用。
1. 定義策略接口
定義一個策略接口,所有具體的策略類都將實現這個接口:
public interface BaseStrategy {void handle(String request);
}
2. 實現具體的策略
實現幾個具體的策略類,例如處理訂單和支付:
@Component("order")
@Slf4j
public class OrderStrategy implements BaseStrategy {@Overridepublic void handle(String request) {System.out.println("下單成功" + request);}
}@Component("pay")
@Slf4j
public class PayStrategy implements BaseStrategy {@Overridepublic void handle(String request) {System.out.println("支付成功" + request);}
}
也可以通過配置類的方式注入策略模式實現類,先注釋其中的@Component注解
@Configuration
public class HandlerConfig {@Bean("order")public BaseStrategy handleOrder() {return new OrderStrategy();}@Bean("pay")public BaseStrategy handlePay() {return new PayStrategy();}
}
3. 創建策略工廠
為了方便獲取不同的策略,我們可以創建一個工廠類 BaseFactory,它將通過依賴注入管理策略的實例,并提供獲取策略的功能。
@Component
@Slf4j
public class BaseFactory {@Resourceprivate Map<String, BaseStrategy> handlerMap;public BaseStrategy getHandler(String type) {return handlerMap.getOrDefault(type, (request) -> {log.error("Unknown request type: " + type);});}
}
在這個類中,我們使用 @Resource 注解注入了一個 Map<String, BaseStrategy>,這個 Map 將所有注冊的策略按名稱存儲起來。通過策略名稱,我們可以從 Map 中獲取到對應的策略對象。
4. 使用策略工廠處理請求
@RestController
@RequestMapping("base")
@Slf4j
public class BaseController {@Resourceprivate BaseFactory baseFactory;@GetMapping("/getHandler")public ResponseEntity<String> getHandler(@RequestParam String type, @RequestParam String message) {BaseStrategy handler = baseFactory.getHandler(type);if (handler != null) {handler.handle(message);return ResponseEntity.ok("操作已執行: " + type);} else {return ResponseEntity.badRequest().body("策略類型不存在: " + type);}}
}