springboot責(zé)任鏈模式實(shí)現(xiàn)多級(jí)校驗(yàn)
責(zé)任鏈模式是將鏈中的每一個(gè)節(jié)點(diǎn)看作是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求不同,且內(nèi)部自動(dòng)維護(hù)一個(gè)下一節(jié)點(diǎn)對(duì)象。
當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥伟l(fā)出時(shí),會(huì)沿著鏈的路徑依此傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止。
屬于行為型模式。
1、定義處理器接口
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {
private Integer creditScore;
private Integer quantity;
}
public interface OrderHandler {
boolean handle(Order order);
}
2、實(shí)現(xiàn)不同的校驗(yàn)處理器
信用校驗(yàn)處理器:
@Component
public class CreditHandler implements OrderHandler{
@Override
public boolean handle(Order order) {
if (order.getCreditScore() % 2 != 0){
System.out.println("信用不足");
return false;
}
return true;
}
}
庫(kù)存校驗(yàn)處理器:
@Component
public class StockHandler implements OrderHandler{
@Override
public boolean handle(Order order) {
if (order.getQuantity() > 20){
System.out.println("庫(kù)存不足");
return false;
}
return true;
}
}
3、責(zé)任鏈管理器
@Component
public class OrderHandlerChain {
private final List<OrderHandler> handlers;
public OrderHandlerChain(List<OrderHandler> handlers){
this.handlers = handlers;
}
public boolean process(Order order){
for (OrderHandler handler : handlers) {
if (!handler.handle(order)){
return false;
}
}
return true;
}
}
4、服務(wù)類調(diào)用責(zé)任鏈
@Component
public class OrderService {
private final OrderHandlerChain handlerChain;
private OrderService(OrderHandlerChain handlerChain){
this.handlerChain = handlerChain;
}
public boolean processOrder(Order order){
boolean process = handlerChain.process(order);
if (process){
System.out.println("校驗(yàn)成功");
}
return process;
}
}
5、測(cè)試
@SpringBootTest
public class OrderServiceTest {
@Autowired
private OrderService orderService;
@Test
public void testOrderProcess(){
Order order = new Order(2, 5);
orderService.processOrder(order);
Order order1 = new Order(2, 5);
orderService.processOrder(order1);
Order order2 = new Order(2, 21);
orderService.processOrder(order2);
}
}
6、優(yōu)點(diǎn)
解耦邏輯:每個(gè)校驗(yàn)邏輯獨(dú)立實(shí)現(xiàn),符合單一職責(zé)原則
靈活擴(kuò)展:新增校驗(yàn)只需添加新的Handler實(shí)現(xiàn)類,無(wú)需修改現(xiàn)有代碼
支持動(dòng)態(tài)調(diào)整:可通過(guò)調(diào)整List的順序來(lái)改變校驗(yàn)順序
利用Spring自動(dòng)裝配:使用Spring的依賴注入簡(jiǎn)化責(zé)任鏈構(gòu)建
到此這篇關(guān)于springboot責(zé)任鏈模式實(shí)現(xiàn)多級(jí)校驗(yàn)的文章就介紹到這了,更多相關(guān)springboot多級(jí)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳細(xì)說(shuō)明關(guān)于Java的數(shù)據(jù)庫(kù)連接(JDBC)
這篇文章主要介紹了詳細(xì)說(shuō)明關(guān)于Java的數(shù)據(jù)庫(kù)連接JDBC,JDBC是用Java語(yǔ)言向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,需要的朋友可以參考下面文章內(nèi)容2021-09-09
Java通過(guò)反射將 Excel 解析成對(duì)象集合實(shí)例
這篇文章主要介紹了Java通過(guò)反射將 Excel 解析成對(duì)象集合實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Spring編程式和聲明式事務(wù)實(shí)例講解小結(jié)
這篇文章主要介紹了Spring編程式和聲明式事務(wù)實(shí)例講解小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解
LogFactory來(lái)自common-logging包。如果用LogFactory.getLog,你可以用任何實(shí)現(xiàn)了通用日志接口的日志記錄器替換log4j,而程序不受影響2013-09-09
為什么不建議使用Java自定義Object作為HashMap的key
這篇文章主要介紹了為什么不建議使用Java自定義Object作為HashMap的key,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06

