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