輕松掌握java責(zé)任鏈模式
定義:責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類推。
特點(diǎn):1、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。
2、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。
3、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。
4、增加新的請(qǐng)求處理類很方便。
企業(yè)級(jí)開發(fā)和常用框架中的應(yīng)用:spring,struts的攔截器,servlet的過濾器
具體實(shí)例:
/**
*這里以公司請(qǐng)假舉例:
*1、某人請(qǐng)假(事件)
*2、項(xiàng)目組長(zhǎng)審批:小于三天可以審批,大于三天請(qǐng)示上級(jí)
*3、部門主管審批:小于十天可以審批,大于十天請(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)),通過!");
System.out.println();
}else{
System.out.println(this.getName()+"(主管),沒有權(quán)限!");
this.nextLeader.handler(event);
}
}
}
/**
* 請(qǐng)假流程中的第二個(gè)對(duì)象,部門主管
*/
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)假通過!");
System.out.println();
}else{
System.out.println(this.getName()+"(總經(jīng)理),沒有權(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)假人不通過!");
System.out.println();
}
}
}
責(zé)任鏈模式主要用于流程控制這一類的開發(fā),相比較于單純用if-else模式,在代碼修改和整合上有更高的效率,更利于代碼維護(hù)。而且,需要增加責(zé)任鏈中的對(duì)象時(shí),需要在再實(shí)現(xiàn)一個(gè)具體的責(zé)任鏈類,然后創(chuàng)建責(zé)任對(duì)象,并維護(hù)責(zé)任鏈關(guān)系就行,不需要更大的開銷,而且在實(shí)際設(shè)計(jì)中,我們很多時(shí)候責(zé)任鏈的維護(hù)都在配置文件中進(jìn)行,這樣我們將節(jié)省更多的開發(fā)時(shí)間。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA中Javaweb項(xiàng)目圖片加載不出來解決方案
在IDEA中能夠正常的預(yù)覽到圖片,但是在生成項(xiàng)目的war包時(shí),項(xiàng)目的目錄結(jié)構(gòu)卻會(huì)發(fā)生變化,所以無(wú)法訪問圖片,本文主要介紹了IDEA中Javaweb項(xiàng)目圖片加載不出來解決方案,感興趣的可以了解一下2023-10-10
CMD運(yùn)行Intellij Idea編譯后的class文件操作
這篇文章主要介紹了CMD運(yùn)行Intellij Idea編譯后的class文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
IDEA2023.3.4開啟SpringBoot項(xiàng)目的熱部署(圖文)
本文使用的開發(fā)工具是idea,使用的是springboot框架開發(fā)的項(xiàng)目,配置熱部署,可以提高開發(fā)效率,文中通過圖文介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
java中建立0-10m的消息(字符串)實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨ava中建立0-10m的消息(字符串)實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
詳解SpringBoot?調(diào)用外部接口的三種方式
SpringBoot不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡(jiǎn)化配置來進(jìn)一步簡(jiǎn)化了Spring應(yīng)用的整個(gè)搭建和開發(fā)過程,這篇文章主要介紹了SpringBoot?調(diào)用外部接口的三種方式,需要的朋友可以參考下2023-04-04
java并發(fā)編程專題(二)----如何創(chuàng)建并運(yùn)行java線程
這篇文章主要介紹了java并發(fā)編程如何創(chuàng)建并運(yùn)行java線程,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
Java打亂ArrayList生成一個(gè)隨機(jī)序列列表
有時(shí)候會(huì)需要將一個(gè)ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機(jī)出題、答案選項(xiàng)打亂、連線題打亂、抽獎(jiǎng)號(hào)碼打亂等等,把我自己寫的一段代碼貼出來分享給大家。2016-08-08
Java使用Validation自定義Double類型屬性校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了Java如何使用Validation自定義Double類型屬性校驗(yàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-11-11

