【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目錄
- 一、責任鏈模式簡介
- 二、責任鏈模式相關設計模式
- 三、責任鏈模式 代碼示例
- 1、用戶賬戶類
- 2、校驗器父類
- 3、用戶名校驗器
- 4、密碼校驗器
- 5、電話號碼校驗器
- 6、運行測試
一、責任鏈模式簡介
責任鏈模式 , 又稱為 職責鏈模式 ;
責任鏈模式定義 : 為 請求 創建一個接收該 請求對象 的 鏈 , 鏈條中每個元素都是一個對象 ;
責任鏈模式類型 : 行為型 ;
責任鏈模式 適用場景 : 一個 請求 的 處理 , 需 要多個對象 中的 一個或若干個對象 協作進行處理 ;
責任鏈模式 優點 :
① 解耦 : 請求的 發送者 和 接收者 解耦 ; 接收者 是 請求的處理者 ;
② 動態組合 : 責任鏈 可以 動態組合 , 使用配置 設置責任鏈的 順序及 是否出現 ; 可以隨時對責任鏈排序 , 隨時增加拆除責任鏈中的某個請求對象 ;
責任鏈模式 缺點 :
① 性能 : 如果 責任鏈 太長 , 或責任鏈中請求的 處理時間過長 , 可能會 影響性能 ;
② 個數 : 責任鏈 可能過多 ;
二、責任鏈模式相關設計模式
責任鏈模式 與 狀態模式 比較 :
在 責任鏈模式 中 , 并 不指定 下一個處理的 請求對象 是哪個 ; 責任鏈 中 鏈條順序 可以 任意組合排序 ;
在 狀態模式 中 , 需要讓 每個 狀態 知道下一個需要處理的狀態是誰 ;
三、責任鏈模式 代碼示例
需求 :
- OA 中審批流程 , 需要 組長 , 經理 , 總監 審批請求 ;
- 賬號注冊時進行校驗 , 先后校驗 賬號 , 密碼 , 手機號 等 ;
使用責任鏈模式實現上述操作 , 可以消除很多 if else 分支 , 增加功能的擴展性 , 如果在責任鏈條中添加一個請求 , 只需要新建一個類即可 , 這個類就是責任鏈中的請求元素 ; 可以選擇性使用一個或多個或所有的請求對象 ;
這里以賬戶校驗為示例 : 使用 責任鏈 , 校驗用戶賬戶的 賬號 , 密碼 , 手機號 等信息 ;
1、用戶賬戶類
package responsibility;/*** 用戶賬戶信息* 包含 : 賬號 , 密碼 , 電話號碼*/ public class UserAccount {private String userName;private String password;private String phoneNumber;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;} }
2、校驗器父類
校驗類的父類 , 校驗賬號 , 校驗密碼 , 校驗手機號 的請求類都需要 繼承該類 ;
封裝請求對象 : 責任鏈的核心是 請求對象 中 包含一個自己 , 包含一個與自己相同類型的對象 ; 責任鏈模式中的 校驗器 封裝一個 校驗器 本身 , 使用 protected 修飾的目的是讓子類可以獲取到該類 ;
設置下一個請求對象 : 每個請求對象中 , 設置下一個請求對象 , 組成鏈式結構 ;
請求過程 : 抽象方法 , 需要子類實現 , 主要 實現 請求對象 需要的具體的業務邏輯 , 如校驗 , 審批 等 ;
package responsibility;/*** 校驗類的父類* 校驗賬號 , 校驗密碼 , 校驗手機號 的請求類都需要繼承該類*/ public abstract class Verify {/*** 責任鏈的核心是類中包含一個自己* 包含一個與自己相同類型的對象* 責任鏈模式中的 校驗器 封裝一個 校驗器 本身* 使用 protected 修飾的目的是讓子類可以獲取到該類*/protected Verify verify;/*** 設置下一個校驗器* @param verify*/public void setNextVerify(Verify verify) {this.verify = verify;}/*** 校驗過程* 需要子類進行實現*/public abstract void deploy(UserAccount userAccount); }3、用戶名校驗器
package responsibility;import com.sun.xml.internal.ws.util.StringUtils;/*** 校驗用戶名稱*/ public class UserNameVerify extends Verify{@Overridepublic void deploy(UserAccount userAccount) {if (userAccount.getUserName() != null){System.out.println("用戶名校驗通過");// 獲取下一個驗證器if (verify != null) {verify.deploy(userAccount);}} else {System.out.println("用戶名校驗未通過");}} }
4、密碼校驗器
package responsibility;/*** 校驗密碼*/ public class PasswordVerify extends Verify{@Overridepublic void deploy(UserAccount userAccount) {if (userAccount.getPassword() != null){System.out.println("密碼校驗通過");// 獲取下一個驗證器if (verify != null) {verify.deploy(userAccount);}} else {System.out.println("密碼校驗未通過");}} }
5、電話號碼校驗器
package responsibility;/*** 校驗手機號*/ public class PhoneVerify extends Verify{@Overridepublic void deploy(UserAccount userAccount) {if (userAccount.getPhoneNumber() != null){System.out.println("手機號校驗通過");// 獲取下一個驗證器if (verify != null) {verify.deploy(userAccount);}} else {System.out.println("手機號校驗未通過");}} }
6、運行測試
package responsibility;public class Main {public static void main(String[] args) {UserNameVerify userNameVerify = new UserNameVerify();PasswordVerify passwordVerify = new PasswordVerify();PhoneVerify phoneVerify = new PhoneVerify();UserAccount userAccount = new UserAccount();userAccount.setUserName("username");userAccount.setPassword("123456");userAccount.setPhoneNumber("13888888888");// 創建職責鏈userNameVerify.setNextVerify(passwordVerify);passwordVerify.setNextVerify(phoneVerify);// 開始校驗 , 執行職責鏈userNameVerify.deploy(userAccount);} }
運行結果 :
總結
以上是生活随笔為你收集整理的【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 插件化】Hook 插件
- 下一篇: 【错误记录】Android Studio