輕松掌握java責(zé)任鏈模式
定義:責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類(lèi)型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類(lèi)型的設(shè)計(jì)模式屬于行為型模式。在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類(lèi)推。
特點(diǎn):1、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。
2、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。
3、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過(guò)改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。
4、增加新的請(qǐng)求處理類(lèi)很方便。
企業(yè)級(jí)開(kāi)發(fā)和常用框架中的應(yīng)用:spring,struts的攔截器,servlet的過(guò)濾器
具體實(shí)例:
/** *這里以公司請(qǐng)假舉例: *1、某人請(qǐng)假(事件) *2、項(xiàng)目組長(zhǎng)審批:小于三天可以審批,大于三天請(qǐng)示上級(jí) *3、部門(mén)主管審批:小于十天可以審批,大于十天請(qǐng)示上級(jí) *4、總經(jīng)理審批 :小于30天可以審批,大于30天不批準(zhǔn) */ public class Demo { public static void main(String[] args) { Event event = new Event("程序員", 32, "回老家探親"); Leader a = new GroupLeader("張三"); Leader b = new Manager("李四"); Leader c = new GeneralManager("王五"); //指定責(zé)任鏈模式 a.setNextLeader(b); b.setNextLeader(c); a.handler(event); } } /** * 事件對(duì)象,責(zé)任鏈中的具體處理事件 * 該實(shí)例中即為請(qǐng)假這件事兒 */ class Event{ private String name; private int days; private String reason; public Event(String name, int days, String reason) { super(); this.name = name; this.days = days; this.reason = reason; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } } /** * 抽象責(zé)任鏈對(duì)象,后面的所有實(shí)際責(zé)任鏈對(duì)象繼承自該對(duì)象 */ abstract class Leader{ private String name; protected Leader nextLeader;//責(zé)任鏈中的下一個(gè)責(zé)任對(duì)象,這是讓責(zé)任鏈持續(xù)下去的基礎(chǔ) public Leader(String name) { super(); this.name = name; } public void setNextLeader(Leader nextLeader) { this.nextLeader = nextLeader; } public String getName() { return name; } public void setName(String name) { this.name = name; } protected abstract void handler(Event event); } /** * 請(qǐng)假流程中的第一個(gè)對(duì)象,組長(zhǎng) */ class GroupLeader extends Leader{ public GroupLeader(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 3){ System.out.println("--------------------請(qǐng)假條--------------------"); System.out.print("| 請(qǐng)假人:"+event.getName()+" | "); System.out.println("請(qǐng)假天數(shù):"+event.getDays()+"天"+" |"); System.out.println("| 請(qǐng)假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(組長(zhǎng)),通過(guò)!"); System.out.println(); }else{ System.out.println(this.getName()+"(主管),沒(méi)有權(quán)限!"); this.nextLeader.handler(event); } } } /** * 請(qǐng)假流程中的第二個(gè)對(duì)象,部門(mén)主管 */ class Manager extends Leader{ public Manager(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 10){ System.out.println("--------------------請(qǐng)假條--------------------"); System.out.print("| 請(qǐng)假人:"+event.getName()+" | "); System.out.println("請(qǐng)假天數(shù):"+event.getDays()+"天"+" |"); System.out.println("| 請(qǐng)假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(主管),請(qǐng)假通過(guò)!"); System.out.println(); }else{ System.out.println(this.getName()+"(總經(jīng)理),沒(méi)有權(quán)限!"); this.nextLeader.handler(event); } } } /** * 請(qǐng)假流程中的第三個(gè)對(duì)象,總經(jīng)理 */ class GeneralManager extends Leader{ public GeneralManager(String name) { super(name); } protected void handler(Event event) { if(event.getDays() < 30){ System.out.println("--------------------請(qǐng)假條--------------------"); System.out.print("| 請(qǐng)假人:"+event.getName()+" | "); System.out.println("請(qǐng)假天數(shù):"+event.getDays()+"天"+" |"); System.out.println("| 請(qǐng)假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(總經(jīng)理)"); System.out.println(); }else{ System.out.println("--------------------請(qǐng)假條--------------------"); System.out.print("| 請(qǐng)假人:"+event.getName()+" | "); System.out.println("請(qǐng)假天數(shù):"+event.getDays()+"天"+" |"); System.out.println("| 請(qǐng)假原因:"+event.getReason() + " |"); System.out.println("審批人:"+this.getName()+"(總經(jīng)理),請(qǐng)假人不通過(guò)!"); System.out.println(); } } }
責(zé)任鏈模式主要用于流程控制這一類(lèi)的開(kāi)發(fā),相比較于單純用if-else模式,在代碼修改和整合上有更高的效率,更利于代碼維護(hù)。而且,需要增加責(zé)任鏈中的對(duì)象時(shí),需要在再實(shí)現(xiàn)一個(gè)具體的責(zé)任鏈類(lèi),然后創(chuàng)建責(zé)任對(duì)象,并維護(hù)責(zé)任鏈關(guān)系就行,不需要更大的開(kāi)銷(xiāo),而且在實(shí)際設(shè)計(jì)中,我們很多時(shí)候責(zé)任鏈的維護(hù)都在配置文件中進(jìn)行,這樣我們將節(jié)省更多的開(kāi)發(fā)時(shí)間。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法
這篇文章主要介紹了java實(shí)現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法,涉及java中列表、集合與數(shù)組相互轉(zhuǎn)換的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03spring中@Autowire和@Resource的區(qū)別在哪里(推薦)
這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例
這篇文章主要介紹了Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能,結(jié)合實(shí)例形式分析了java優(yōu)先隊(duì)列的簡(jiǎn)單定義與使用方法,需要的朋友可以參考下2017-11-11SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式
這篇文章主要介紹了SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件的圖文教程
這篇文章主要介紹了IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java和C++通過(guò)new創(chuàng)建的對(duì)象有何區(qū)別?
Java和C++都是面向?qū)ο蟮木幊陶Z(yǔ)言,然而Java和C++在創(chuàng)建對(duì)象時(shí)卻存在不同的方式,由于方式的不同導(dǎo)致在內(nèi)存中管理的不同。這篇文章主要給大家介紹了關(guān)于Java和C++通過(guò)new創(chuàng)建對(duì)象區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11Spring Boot與Spring Security的跨域問(wèn)題解決方案
跨域問(wèn)題是指在Web開(kāi)發(fā)中,瀏覽器出于安全考慮,限制了不同域名之間的資源訪問(wèn),本文重點(diǎn)給大家介紹Spring Boot與Spring Security的跨域問(wèn)題解決方案,感興趣的朋友一起看看吧2023-09-09MyBatis復(fù)雜Sql查詢實(shí)現(xiàn)示例介紹
在利用mybatis做查詢的時(shí)候,一般返回結(jié)果用resulttype,這種情況必須是查詢的結(jié)果在對(duì)應(yīng) 的pojo類(lèi)中有對(duì)應(yīng)的,一般都是單表查詢,但是對(duì)于一些復(fù)雜的情況,比如需要用到多表查詢的時(shí)候,resultType不再適用,此時(shí)一般用resultMap來(lái)表示返回的結(jié)果2022-12-12