設(shè)計(jì)模式專欄
1.定義
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求氛堕,從而避免了請(qǐng)求的發(fā)送者與接受者之間的耦合關(guān)系顾瞪,將這些對(duì)象生成一個(gè)鏈掷邦,并沿著這條鏈傳遞該對(duì)象汪诉,只到有對(duì)象處理這個(gè)請(qǐng)求為止,即:將一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出废恋,沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止扒寄,將這樣的一種模式稱為責(zé)任鏈設(shè)計(jì)模式
2.結(jié)構(gòu)圖
image.png
3.使用場(chǎng)景
多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求鱼鼓,但具體由哪個(gè)對(duì)象處理,只有到運(yùn)行的時(shí)候動(dòng)態(tài)決定
4.抽象簡(jiǎn)單實(shí)現(xiàn)示例:
/**
* 抽象處理著角色该编,聲明請(qǐng)求處理方法迄本,并在其中保留一個(gè)對(duì)下一個(gè)處理節(jié)點(diǎn)的對(duì)象的引用
*/
public abstract class Handler {
/**
* 下一個(gè)節(jié)點(diǎn)的處理者
*/
protected Handler successor;
/**
* 處理請(qǐng)求方法
* @param condition
*/
public abstract void handleRequest(String condition);
}
/**
* 第一個(gè)對(duì)象處理者
*/
public class Handler1 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("handler1Request")){
System.out.println("Handler1 handler request");
return;
}else{
successor.handleRequest(condition);
}
}
}
/**
* 第二個(gè)對(duì)象處理者
*/
public class Handler2 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("handler2Request")){
System.out.println("Handler2 handler request");
return;
}else{
successor.handleRequest(condition);
}
}
}
public class Main {
public static void main(String args[]){
//how to use
Handler1 handler1=new Handler1();
Handler2 handler2 =new Handler2();
handler1.successor=handler2;
handler2.successor=handler1;
handler1.handleRequest("handler2Request");
}
}
image.png
5.具體場(chǎng)景使用示例:
公司員工進(jìn)行報(bào)銷單子,假如組長(zhǎng)的報(bào)銷的金額是1000课竣,經(jīng)理報(bào)銷的金額是3000嘉赎,超過3000的則老板進(jìn)行報(bào)銷,模擬以上場(chǎng)景于樟,實(shí)現(xiàn)責(zé)任鏈?zhǔn)纠缦?
/**
* 抽象領(lǐng)導(dǎo)
*/
public abstract class Leader {
//上級(jí)領(lǐng)導(dǎo)
Leader nextHandler;
//報(bào)銷金額
abstract int limit();
//具體處理請(qǐng)求方法
abstract void handler(int money);
//是否處理請(qǐng)求判斷
void handerRequest(int money) {
if (money < limit()) {
handler(money);
} else {
if (nextHandler != null)
nextHandler.handerRequest(money);
}
}
}
/**
* 老板
*/
public class BossHandler extends Leader {
@Override
int limit() {
return Integer.MAX_VALUE;
}
@Override
void handler(int money) {
System.out.println("老板報(bào)銷了:" + money);
}
}
/**
* 經(jīng)理
*/
public class ManagerHandler extends Leader {
@Override
int limit() {
return 3000;
}
@Override
void handler(int money) {
System.out.println("項(xiàng)目經(jīng)理報(bào)銷了:" + money);
}
}
/**
* 組長(zhǎng)
*/
public class GroupHandler extends Leader {
@Override
int limit() {
return 1000;
}
@Override
void handler(int money) {
System.out.println("組長(zhǎng)報(bào)銷了:" + money);
}
}
public class Me {
public static void main(String args[]) {
GroupHandler groupHandler = new GroupHandler();
ManagerHandler managerHandler = new ManagerHandler();
BossHandler bossHandler = new BossHandler();
groupHandler.nextHandler = managerHandler;
managerHandler.nextHandler = bossHandler;
groupHandler.handerRequest(500);
groupHandler.handerRequest(1900);
groupHandler.handerRequest(8000);
}
}
image.png