责任链模式
责任链模式是将多个对象连接成一条链,同时这些对象都能接收客户端请求,目的是避免请求发送者与接收者耦合在一起,请求会沿着这条链传递请求,直到有对象处理它为止。
一、责任链模式主要解决了哪些场景?
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
-
公司采购流程审批,不同价钱的采购物品由不同的领导进行审批。
-
邮件审批,不同类型的邮件交给不同领导进行审批。
二、以公司采购举例
1.代码如下:
建立请求类
//请求类
public class PurchaseRequest {
private int type = 0; //请求类型
private float price = 0.0f; //请求金额
private int id = 0;
//构造器
public PurchaseRequest(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;
}
}
建立审批人抽象类
public abstract class Approver {
Approver approver; //处理者
String name; // 名字
public Approver(String name) {
this.name = name;
}
//下一个处理者
public void setApprover(Approver approver) {
this.approver = approver;
}
//处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象
public abstract void processRequest(PurchaseRequest purchaseRequest);
依次建立主管、经理、董事长审批类
public class DirectorApprover extends Approver{
public DirectorApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() <= 5000) {
System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
}else {
approver.processRequest(purchaseRequest);
}
}
}
public class GeneralManagerApprover extends Approver{
public GeneralManagerApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 30000) {
System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
}else {
approver.processRequest(purchaseRequest);
}
}
}
public class ChairmanApprover extends Approver{
public ChairmanApprover(String name) {
super(name);
}
@Override
public void processRequest(PurchaseRequest purchaseRequest) {
if(purchaseRequest.getPrice() > 30000) {
System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
}else {
approver.processRequest(purchaseRequest);
}
}
}
建立client测试
public class AtClient {
public static void main(String[] args) {
PurchaseRequest purchaseRequest = new PurchaseRequest(2, 10000, 2222);
//创建相关的审批人
DirectorApprover directorApprover = new DirectorApprover("李主管");
GeneralManagerApprover generalManagerApprover = new GeneralManagerApprover("张总经理");
ChairmanApprover chairmanApprover = new ChairmanApprover("董事长");
directorApprover.setApprover(generalManagerApprover);
generalManagerApprover.setApprover(chairmanApprover);
chairmanApprover.setApprover(directorApprover);
directorApprover.processRequest(purchaseRequest);
generalManagerApprover.processRequest(purchaseRequest);
}
}
2.运行结果
结果如下:
id= 2222 被 张总经理 处理
id= 2222 被 张总经理 处理
总结
优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。