Java设计模式-责任链模式
Java設計模式-責任鏈模式,我想這是值得你了解一下下的啦。
會了就當復習丫,不會來一起來看看吧。
很喜歡一句話:“八小時內謀生活,八小時外謀發展”。
如果你也喜歡,讓我們一起堅持吧!!
與君共勉😁
一、前言
1)引入:
在現實生活中,一個事件需要經過多個對象處理是很常見的場景。
例如,采購審批流程、請假流程等。就像我們在校請假,輔導員只能批1天,院長批3天到7天,7天以上得找書記簽字。我們就得根據請假天數的不同去找不同的老師簽名,也就是說我們必須記住每個老師姓名、辦公室位置等等,這無疑就增加難度啦。但是轉換到軟件設計中就可以使用責任鏈模式來實現,可以簡單很多,效率也會高許多。
在軟件設計中也有很多這樣的例子,例如Servlet中的Filter、security中的一系列過濾器。都是夾雜著責任鏈模式的。
2)概述:
在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
責任鏈(Chain of Responsibility)模式的定義:為了避免請求發送者與多個請求處理者耦合在一起,于是將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止。
3)角色結構:
職責鏈模式主要包含以下角色。
4)使用場景:
二、案例代碼
2.1、案例:
現需要開發一個請假流程控制系統。請假一天以下的假只需要輔導員同意即可;請假1天到3天的假還需要院長同意;請求3天到7天還需要學院書記同意才行。
2.2、實現:
//請假條 public class LeaveRequest {private String name;//姓名private int num;//請假天數private String content;//請假內容public LeaveRequest(String name, int num, String content) {this.name = name;this.num = num;this.content = content;}public String getName() {return name;}public int getNum() {return num;}public String getContent() {return content;} } //處理者抽象類 public abstract class Handler {protected final static int NUM_ONE = 1;protected final static int NUM_THREE = 3;protected final static int NUM_SEVEN = 7;//該領導處理的請假天數區間private int numStart;private int numEnd;//領導上面還有領導private Handler nextHandler;//設置請假天數范圍 上不封頂public Handler(int numStart) {this.numStart = numStart;}//設置請假天數范圍public Handler(int numStart, int numEnd) {this.numStart = numStart;this.numEnd = numEnd;}//設置上級領導public void setNextHandler(Handler nextHandler){this.nextHandler = nextHandler;}//提交請假條public final void submit(LeaveRequest leave){if(0 == this.numStart){return;}//如果請假天數達到該領導者的處理要求if(leave.getNum() >= this.numStart){this.handleLeave(leave);//如果還有上級 并且請假天數超過了當前領導的處理范圍if(null != this.nextHandler && leave.getNum() > numEnd){this.nextHandler.submit(leave);//繼續提交} else {System.out.println("流程結束");}}}//各級領導處理請假條方法protected abstract void handleLeave(LeaveRequest leave); } //輔導員 public class Counselor extends Handler {public Counselor() {//輔導員 處理1-3天的請假super(Handler.NUM_ONE, Handler.NUM_THREE);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "請假" + leave.getNum() + "天," + leave.getContent() + "。");System.out.println("輔導員審批:同意。");} } //院長 public class Dean extends Handler {public Dean() {//院長處理3-7天的請假super(Handler.NUM_THREE, Handler.NUM_SEVEN);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "請假" + leave.getNum() + "天," + leave.getContent() + "。");System.out.println("院長審批:同意。");} } //學院書記 public class CollegeSecretary extends Handler {public CollegeSecretary() {//學院書記處理7天以上的請假super(Handler.NUM_SEVEN);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "請假" + leave.getNum() + "天," + leave.getContent() + "。");System.out.println("學院書記審批:同意。");} } //測試類 public class Client {public static void main(String[] args) {//請假條來一張LeaveRequest leave = new LeaveRequest("小花",5,"身體不適");//各級領導Counselor counselor= new Counselor();Dean dean = new Dean();CollegeSecretary collegeSecretary = new CollegeSecretary();counselor.setNextHandler(dean);//輔導員的領導是院長dean.setNextHandler(collegeSecretary);//院長的領導是學院書記//之所以在這里設置上級領導,是因為可以根據實際需求來更改設置,如果實戰中上級領導人都是固定的,則可以移到領導實現類中。//提交申請counselor.submit(leave);} }三、總結
優點:
缺點:
四、應用
真正應用到的地方,其實不少,當然最典型的就是在過濾器Filter這個方面。
如果大家使用過Security的話,就知道,它就是由一串過濾器來構成驗證、授權滴。源碼就沒有貼啦哈,一言兩語說不盡哈。~~(狗頭保命)😂
五、自言自語
我也不知道文章寫出來是有用還是無用,只是想做一個分享。希望大家能夠喜歡并且在這里能有收獲。
當然不可否認,我也想獲得那種別人認可的那種快樂,并且能人我繼續維之堅持。
你好啊,要天天開心哦。下篇文章再見。
此系列還在持續更新中… 我一定還會回來的。😁
直到昨晚我才知道前程似錦原來包含著一絲離別的氣味。
總結
以上是生活随笔為你收集整理的Java设计模式-责任链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC系列(十一) | Java 8 C
- 下一篇: MySQL如何存储Emoji表情,UTF