责任链模式
责任链模式三大分类中属于行为型模式
行为型模式关注点在对象之间的通信
代码实践
- 模拟需求
公司有一个财务审批流程
当金额<3000时只需要经理审批即可
当金额>3000是需要总监进行审批
使用责任链模式实现此需求
/**
* 抽象审批类
*
* @author cans
* @date 2022/4/26
**/
public abstract class AbstractApprove {
/**
* 经理
*/
public static final int MANAGER = 1;
/**
* 总监
*/
public static final int CHIEF = 2;
/**
* 总裁
*/
public static final int PRESIDENT = 3;
private int lv;
public int getLv() {
return lv;
}
public void setLv(int lv) {
this.lv = lv;
}
private AbstractApprove nextApprove;
public void nextApprove(AbstractApprove nextApprove) {
this.nextApprove = nextApprove;
}
/**
* 进行审批
*
* @param username 用户名
* @param amount 金额
* @return
*/
public void sendApprove(String username, Double amount) {
this.approve(username,amount);
if (this.nextApprove != null) {
this.nextApprove.sendApprove(username, amount);
}
}
abstract void approve(String username,Double amount);
}
/**
* 经理审批节点 金额小于3000是经理审批
*
* @author cans
* @date 2022/4/26
**/
public class ManagerApprove extends AbstractApprove {
public ManagerApprove() {
this.setLv(MANAGER);
}
@Override
public void approve(String username, Double amount) {
if (amount < 3000) {
System.out.println("经理进行审批username: " + username + " amount: " + amount);
}
}
}
/**
* 总监审批节点 大于等于3000时进行审批
*
* @author cans
* @date 2022/4/26
**/
public class ChiefApprove extends AbstractApprove {
public ChiefApprove() {
this.setLv(CHIEF);
}
@Override
public void approve(String username, Double amount) {
if (amount >= 3000) {
System.out.println("总监进行审批username: " + username + " amount: " + amount);
}
}
}
/**
* 审批功能测试
*
* @author cans
* @date 2022/4/26
**/
public class ApproveTest {
public static void main(String[] args) {
ManagerApprove managerApprove = new ManagerApprove();
ChiefApprove chiefApprove = new ChiefApprove();
managerApprove.nextApprove(chiefApprove);
managerApprove.sendApprove("路人甲", 100D);
managerApprove.sendApprove("炮灰已", 3000D);
}
}
结果:
经理进行审批username: 路人甲 amount: 100.0
总监进行审批username: 炮灰已 amount: 3000.0
这时候随着公司的扩展需要增加审批节点
当金额大于10000的时候需要总裁审批
这时候只需要在链中添加一个节点即可
/**
* 总裁审核 大于10000
*
* @author cans
* @date 2022/4/26
**/
public class PresidentApprove extends AbstractApprove {
public PresidentApprove() {
this.setLv(PRESIDENT);
}
@Override
public void approve(String username, Double amount) {
if (amount > 10000) {
System.out.println("总裁进行审批username: " + username + " amount: " + amount);
}
}
}
/**
* 审批功能测试
*
* @author cans
* @date 2022/4/26
**/
public class ApproveTest {
public static void main(String[] args) {
ManagerApprove managerApprove = new ManagerApprove();
ChiefApprove chiefApprove = new ChiefApprove();
PresidentApprove presidentApprove = new PresidentApprove();
managerApprove.nextApprove(chiefApprove);
chiefApprove.nextApprove(presidentApprove);
managerApprove.sendApprove("路人甲", 100D);
managerApprove.sendApprove("炮灰已", 3000D);
managerApprove.sendApprove("流氓丙", 13000D);
}
}
结果:
经理进行审批username: 路人甲 amount: 100.0
总监进行审批username: 炮灰已 amount: 3000.0
总监进行审批username: 流氓丙 amount: 13000.0
总裁进行审批username: 流氓丙 amount: 13000.0
总结
从以上可以感觉到责任链模式在开发过程中可以非常方便的扩展增加节点,使发送端和审批端能够解耦
优点:
- 降低耦合度
- 灵活可以简单的增加节点
缺点:
- 无法保证请求一定被处理
- 性能受一定影响
- 不方便排错