一 責(zé)任鏈模式
1.1 概述
在進(jìn)行請假申請,財務(wù)報銷申請,需要走部門領(lǐng)導(dǎo)審批,技術(shù)總監(jiān)審批,大領(lǐng)導(dǎo)審批等判斷環(huán)節(jié)。存在請求方和接收方耦合性太強,代碼會比較臃腫,不利于擴展和維護(hù)。
1.2 責(zé)任鏈模式
針對上面,使用責(zé)任鏈模式,將請求方和接收方的業(yè)務(wù)進(jìn)行解耦,客戶端發(fā)送一個請求,由一個抽象的處理請求的類?Handler?來接受這個請求,而具體怎么處理請求,就由?Handler?的子類來完成處理請求方法的實現(xiàn),每個子類滿足條件則自己處理,不滿足調(diào)用下一個處理子類進(jìn)行處理,以此類推,形成一條處理的鏈條。
1.3 代碼實現(xiàn)
1.采購請求類
package com.ljf.day0905;
/**
* @ClassName: ClientRequest
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?21:55:41?
* @Version: V1.0
**/
public class ClientRequest {
/* 請求類型 */
private int type = 0;
/* 請求金額 */
private float price = 0.0f;
/* 請求編號 */
private int id = 0;
/**
* 全參構(gòu)造
*
* @param type
* @param price
* @param id
*/
public ClientRequest(int type, float price, int id) {
this.type = type;
this.price = price;
this.id = id;
}
public int getType() {
return type;
}
public float getPrice() {
return price;
}
public int getId() {
return id;
}
}
2.審批抽象類
package com.ljf.day0905;
/**
* @ClassName: Approver
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?21:56:49?
* @Version: V1.0
**/
public abstract class Approver {
/* 審批人姓名 */
protected String name;
/* 下一個審批人 */
protected Approver approver;
/**
* 創(chuàng)建審批人要指定姓名
*
* @param name
*/
public Approver(String name) {
this.name = name;
}
/**
* 指定下一個審批人
*
* @param approver
*/
public void setApprover(Approver approver) {
this.approver = approver;
}
/**
* 抽象的審批方法
*
* @param purchaseRequest
*/
public abstract void approve(ClientRequest purchaseRequest);
}
3.子類來繼承抽象審批類
3.1?DeaprtLeader
package com.ljf.day0905;
/**
* @ClassName: DeaprtLeader
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?21:58:10?
* @Version: V1.0
**/
public class DeaprtLeader extends Approver {
/**
* 創(chuàng)建審批人要指定姓名
*
* @param name
*/
public DeaprtLeader(String name) {
super(name);
}
/**
* 教學(xué)主任審批邏輯
*
* @param purchaseRequest
*/
public void approve(ClientRequest purchaseRequest) {
if (purchaseRequest.getPrice() <= 5000) {
System.out.println("請求編號:" + purchaseRequest.getId() + "被" +
this.name + "處理");
} else {
approver.approve(purchaseRequest);
}
}
}
2.BossLeader
package com.ljf.day0905;
/**
* @ClassName: BossLeader
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?21:59:23?
* @Version: V1.0
**/
public class BossLeader extends Approver{
/**
* 創(chuàng)建審批人要指定姓名
*
* @param name
*/
public BossLeader(String name) {
super(name);
}
/**
* 院長審批邏輯
*
* @param purchaseRequest
*/
public void approve(ClientRequest purchaseRequest) {
if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <=
10000) {
System.out.println("請求編號:" + purchaseRequest.getId() + "被" +
this.name + "處理");
} else {
approver.approve(purchaseRequest);
}
}
}
3.VicePrincipal
package com.ljf.day0905;
import com.sun.security.ntlm.Client;
/**
* @ClassName: VicePrincipal
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?22:09:25?
* @Version: V1.0
**/
public class VicePrincipal extends Approver {
/**
* 創(chuàng)建審批人要指定姓名
*
* @param name
*/
public VicePrincipal(String name) {
super(name);
}
/**
* 副校長審批邏輯
*
* @param purchaseRequest
*/
public void approve(ClientRequest purchaseRequest) {
if (purchaseRequest.getPrice() > 10000 ) {
System.out.println("請求編號:" + purchaseRequest.getId() + "被" +
this.name + "處理");
} else {
approver.approve(purchaseRequest);
}
}
}
4.測試
package com.ljf.day0905;
/**
* @ClassName: TestZe
* @Description: TODO
* @Author: admin
* @Date: 2023/09/05?22:00:19?
* @Version: V1.0
**/
public class TestZe {
public static void main(String[] args) {
// 創(chuàng)建采購請求
ClientRequest purchaseRequest = new ClientRequest(1, 33310000, 1);
// 創(chuàng)建審批人
Approver departmentApprover = new DeaprtLeader("團(tuán)主任");
Approver dean = new BossLeader("方院長");
Approver vicePrincipal = new VicePrincipal("磊副校長");
// Approver principal = new Principal("喜校長");
// 設(shè)置下一個審批人
departmentApprover.setApprover(dean);
// 這里要形成一個環(huán)鏈,避免如果 30000 金額以下的請求
// 直接交給校長處理,會出現(xiàn)空指針
// 當(dāng)然,如果程序規(guī)定只能從主任開始處理
// 一層一層最后到校長處理,形成一個單鏈,這里就不用了設(shè)置了
dean.setApprover(vicePrincipal);
vicePrincipal.setApprover(departmentApprover);
// principal.setApprover(departmentApprover);
// 測試:入口
departmentApprover.approve(purchaseRequest);
}
}
5.結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-703262.html
責(zé)任鏈模式(Chain of Responsibility Pattern)_Myovlmx的博客-CSDN博客?文章來源地址http://www.zghlxwxcb.cn/news/detail-703262.html
到了這里,關(guān)于面試設(shè)計模式-責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!