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