- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java設計模式之責任鏈模式詳解
各個(gè)部門(mén)協(xié)同合作完成一個(gè)任務(wù),每個(gè)部門(mén)都有各自的職責,一個(gè)部門(mén)完成后,變回轉交給下一個(gè)部門(mén),直到所有部門(mén)都處理了,這個(gè)任務(wù)才完成。
將請求與處理解耦。
處理者只需要關(guān)注自己感興趣的請求進(jìn)行處理,對于不感興趣的請求,直接轉發(fā)給下一個(gè)節點(diǎn)對象。
1、校驗用戶(hù)名或密碼是否為空。
2、校驗用戶(hù)名是否存在。
3、校驗是否有權限。
@Data public class Member { private String loginName; private String loginPass; private String roleName; public Member(String loginName, String loginPass) { this.loginName = loginName; this.loginPass = loginPass; } }
傳統編碼,在同一個(gè)方法里一個(gè)一個(gè)進(jìn)行判斷。
public class MemberService { public void login(String loginName, String loginPass) { if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(loginPass)) { System.out.println("用戶(hù)名或密碼不為空,校驗失敗"); return; } System.out.println("用戶(hù)名、密碼校驗成功"); if (!"James".equals(loginName)) { System.out.println("用戶(hù)不存在"); return; } Member member = new Member(); member.setRoleName("管理員"); if (!"管理員".equals(member.getRoleName())) { System.out.println("您不是管理員,沒(méi)有權限"); return; } System.out.println("登錄成功"); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "null"); } }
使用責任鏈和建造者結合模式,將每個(gè)步驟處理連起來(lái)。
抽象出處理類(lèi)。
public abstract class Handler<T> { // 指向下一個(gè)處理類(lèi) protected Handler chain; // 設置下一個(gè)處理類(lèi) public void next(Handler handler) { this.chain = handler; } // 具體處理邏輯 public abstract void doHandler(Member member); // 構建一條鏈式處理邏輯 public static class Builder<T> { // 第一個(gè)處理類(lèi) private Handler<T> head; // 最后一個(gè)處理類(lèi) private Handler<T> tail; // 從頭開(kāi)始添加處理類(lèi) public Builder<T> addHandler(Handler<T> handler) { if (this.head == null) { // 只有一個(gè)處理類(lèi),所以不需要設置下一個(gè)處理類(lèi) this.head = this.tail = handler; return this; } // 設置下一個(gè)處理類(lèi) this.tail.next(handler); // 尾部設置為下一個(gè)處理類(lèi)的引用 this.tail = handler; return this; } // 返回的是第一個(gè)處理類(lèi) public Handler<T> builder() { return this.head; } } }
具體實(shí)現三個(gè)處理類(lèi),來(lái)進(jìn)行分別校驗
public class ValidateHandler extends Handler { @Override public void doHandler(Member member) { if (StringUtils.isEmpty(member.getLoginName()) || StringUtils.isEmpty(member.getLoginPass())) { System.out.println("用戶(hù)名或密碼不為空,校驗失敗"); return; } System.out.println("用戶(hù)名、密碼校驗成功"); chain.doHandler(member); } } public class LoginHandler extends Handler { @Override public void doHandler(Member member) { if (!"James".equals(member.getLoginName())){ System.out.println("用戶(hù)名不存在"); return; } System.out.println("登錄成功"); member.setRoleName("管理員"); chain.doHandler(member); } } public class AuthHandler extends Handler { @Override public void doHandler(Member member) { if (!"管理員".equals(member.getRoleName())) { System.out.println("您不是管理員,沒(méi)有權限"); return; } System.out.println("您是管理員,允許操作"); } }
public class MemberService { public void login(String loginName, String loginPass) { // 構建一條鏈式處理 Handler.Builder builder = new Handler.Builder() .addHandler(new ValidateHandler()) .addHandler(new LoginHandler()) .addHandler(new AuthHandler()); // 從第一個(gè)處理類(lèi)執行到最后一個(gè)處理類(lèi) builder.builder().doHandler(new Member("James11", "1234")); } public static void main(String[] args) { MemberService memberService = new MemberService(); memberService.login("Ja1mes", "1234"); } }
過(guò)濾器,可以配置多個(gè)過(guò)濾器來(lái)干不同的事情,然后一個(gè)一個(gè)執行。
FilterChain。
到此這篇關(guān)于Java設計模式之責任鏈模式詳解的文章就介紹到這了,更多相關(guān)Java責任鏈模式內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站