您好,登錄后才能下訂單哦!
這篇文章主要介紹“web設計模式的責任鏈模式有哪些優缺點”,在日常操作中,相信很多人在web設計模式的責任鏈模式有哪些優缺點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”web設計模式的責任鏈模式有哪些優缺點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
客戶端發出一個請求,鏈上的對象都有機會來處理這一請求,而客戶端不需要知道誰是具體的處理對象。這樣就實現了請求者和接受者之間的解耦,并且在客戶端可以實現動態的組合職責鏈。使編程更有靈活性。
有多個對象共同對一個任務進行處理。
些對象使用鏈式存儲結構,形成一個鏈,每個對象知道自己的下一個對象。
一個對象對任務進行處理,可以添加一些操作后將對象傳遞個下一個任務。也可以在此對象上結束任務的處理,并結束任務。
客戶端負責組裝鏈式結構,但是客戶端不需要關心最終是誰來處理了任務。
抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現。
具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。
優點: 職責鏈模式的最主要功能就是:動態組合,請求者和接受者解耦。 請求者和接受者松散耦合:請求者不需要知道接受者,也不需要知道如何處理。每個職責對象只負責自己的職責范圍,其他的交給后繼者。各個組件間完全解耦。 動態組合職責:職責鏈模式會把功能分散到單獨的職責對象中,然后在使用時動態的組合形成鏈,從而可以靈活的分配職責對象,也可以靈活的添加改變對象職責。 缺點: 產生很多細粒度的對象:因為功能處理都分散到了單獨的職責對象中,每個對象功能單一,要把整個流程處理完,需要很多的職責對象,會產生大量的細粒度職責對象。 不一定能處理:每個職責對象都只負責自己的部分,這樣就可以出現某個請求,即使把整個鏈走完,都沒有職責對象處理它。這就需要提供默認處理,并且注意構造鏈的有效性。
多條件流程判斷 權限控制
ERP系統 流程審批 總經理、人事經理、項目經理
Java過濾器的底層實現Filter 比如:在Java過濾器中客戶端發送請求到服務器端,過濾會經過參數過濾、session過濾、表單過濾、隱藏過濾、檢測請求頭過濾
在網關作為微服務程序的入口,攔截客戶端所有的請求實現權限控制 ,比如先判斷Api接口限流、黑名單、用戶會話、參數過濾。 Api接口限流→黑名單攔截→用戶會話→參數過濾
public abstract class GatewayHandler { /** * 下一個handler */ protected GatewayHandler nextGatewayHandler; /** * 實現的handler 處理方案 強制必須實現 */ public abstract void service(); public void setNextGatewayHandler(GatewayHandler nextGatewayHandler) { this.nextGatewayHandler = nextGatewayHandler; } /** *執行下一個handler */ protected void nextService() { if (nextGatewayHandler != null) { nextGatewayHandler.service();// 指向下一關黑名單 } } }
@Component public class CurrentLimitHandler extends GatewayHandler { @Override public void service() { System.out.println("第一關網關限流判斷...."); nextService(); } } @Component public class BlacklistHandler extends GatewayHandler { @Override public void service() { System.out.println("第二關黑名單攔截判斷...."); nextService(); } } @Component public class ConversationHandler extends GatewayHandler { @Override public void service() { System.out.println("第三關用戶會話攔截判斷...."); nextService(); } }
CREATE TABLE `gateway_handler` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `handler_name` varchar(32) DEFAULT NULL COMMENT 'handler名稱', `handler_id` varchar(32) DEFAULT NULL COMMENT 'handler主鍵id', `prev_handler_id` varchar(32) DEFAULT NULL, `next_handler_id` varchar(32) DEFAULT NULL COMMENT '下一個handler', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='權限表'; -- ---------------------------- -- Records of gateway_handler -- ---------------------------- INSERT INTO `gateway_handler` VALUES ('16', 'Api接口限流', 'currentLimitHandler', null, 'blacklistHandler'); INSERT INTO `gateway_handler` VALUES ('17', '黑名單攔截', 'blacklistHandler', 'currentLimitHandler', 'conversationHandler'); INSERT INTO `gateway_handler` VALUES ('18', '會話驗證', 'conversationHandler', 'blacklistHandler', null);
@Service public class GatewayHandlerService { @Autowired private GatewayHandlerMapper gatewayHandlerMapper; private GatewayHandler firstGatewayHandler; /** * 獲取數據庫第一個handeler封裝 * * @return */ public GatewayHandler getFirstGatewayHandler() { if (firstGatewayHandler != null) { return firstGatewayHandler; } // 1.從數據庫中查詢地址hanlder GatewayHandlerEntity firstGatewayHandlerEntity = gatewayHandlerMapper.getFirstGatewayHandler(); if (firstGatewayHandlerEntity == null) { return null; } // 2.獲取springboot注入容器id String handlerId = firstGatewayHandlerEntity.getHandlerId(); GatewayHandler firstGatewayHandler = SpringUtils.getBean(handlerId, GatewayHandler.class); // 3.獲取下一個handler容器beanid String nextHandlerId = firstGatewayHandlerEntity.getNextHandlerId(); // 4. 記錄當前循環hanlder對象 GatewayHandler tempGatewayHandler = firstGatewayHandler; while (!StringUtils.isEmpty(nextHandlerId)) { // 5.從springboot容器獲取下一個handerl對象 GatewayHandler nextGatewayHandler = SpringUtils.getBean(nextHandlerId, GatewayHandler.class); tempGatewayHandler.setNextGatewayHandler(nextGatewayHandler); // 6.設置下一個nextHandlerId GatewayHandlerEntity nextGatewayHandlerEntity = gatewayHandlerMapper.getByHandler(nextHandlerId); if (nextGatewayHandlerEntity == null) { break; } nextHandlerId = nextGatewayHandlerEntity.getNextHandlerId(); tempGatewayHandler = nextGatewayHandler; } this.firstGatewayHandler = firstGatewayHandler; return firstGatewayHandler; } }
public interface GatewayHandlerMapper { /** * 獲取第一個GatewayHandler * * @return */ @Select("SELECT handler_name AS handlerName,handler_id AS handlerid ,prev_handler_id AS prevhandlerid ,next_handler_id AS nexthandlerid FROM gateway_handler WHERE prev_handler_id is null;;") public GatewayHandlerEntity getFirstGatewayHandler(); @Select("SELECT handler_name AS handlerName,handler_id AS handlerid ,prev_handler_id AS prevhandlerid ,next_handler_id AS nexthandlerid FROM gateway_handler WHERE handler_id=#{handlerId}") public GatewayHandlerEntity getByHandler(String handlerId); } @Data public class GatewayHandlerEntity implements Serializable, Cloneable { /** 主鍵ID */ private Integer id; /** handler名稱 */ private String handlerName; /** handler主鍵id */ private String handlerId; /** 下一個handler */ private String nextHandlerId; }
@RestController public class HandlerController { @Autowired private GatewayHandlerService gatewayHandlerService; @RequestMapping("/client") public String client() { GatewayHandler firstGatewayHandler = gatewayHandlerService.getFirstGatewayHandler(); firstGatewayHandler.service(); return "success"; } }
本文參考:螞蟻課堂:http://www.mayikt.com
到此,關于“web設計模式的責任鏈模式有哪些優缺點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。