java 设计模式之责任链模式②②
人生路漫漫,愿你我彼此善良而真诚。
设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/27
定义
为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
项目需求
假设学校要购进一批材料,要求领导签字
- 主任(5k元内)
- 副校长(5k元 - 2w元)
- 校长(2w万以上)
那么用通常的办法就是使用if else if else 来判断
假设副校长可签署的价格由2w元提高到3w元,那么校长的价格就应该变为3w以上
这样的话就违背了开闭原则(对扩展开放,对修改关闭)!
角色分析
UML类图(1.1):
- 抽象处理者(Approver)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
- 具体处理者(DirectorApprover…)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家
代码实现
MaterialScience(具体材料实现):
public class MaterialScience {
//材料价格
private int price;
public MaterialScience(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
Approver(责任人抽象类,包含下一位责任人):
public abstract class Approver {
/**
* 下一个责任人
*/
Approver approver;
/**
* 请求批准接口
*/
public abstract void approvalRequest(MaterialScience materialScience);
//设置批准人
public void setApprover(Approver approver) {
this.approver = approver;
}
}
DirectorApprover(主任责任人):
public class DirectorApprover extends Approver {
private float price;
/**
* 责任人名字
*/
String name;
public DirectorApprover(String name,float price) {
this.price = price;
this.name = name;
}
@Override
public void approvalRequest(MaterialScience materialScience) {
if (materialScience.getPrice() < price) {
Log.i("责任链模式","当前是 "+ name+" 批准");
}else{
//如果请求不满足 去下一个责任人哪里判断
approver.approvalRequest(materialScience);
}
}
}
DirectorApprover构造器参数:
- 参数一:签字人名字
- 参数二:签字人可签字价格
VicePrincipalApprover(副校长责任人):
public class VicePrincipalApprover extends Approver{
/**
* 可批准的价格
*/
private float price;
/**
* 责任人名字
*/
String name;
public VicePrincipalApprover(String name,float price) {
this.price = price;
this.name = name;
}
@Override
public void approvalRequest(MaterialScience materialScience) {
if (materialScience.getPrice() < price) {
Log.i("责任链模式","当前是 "+ name+" 批准");
}else{
//如果条件> 则让下一位责任人批准
approver.approvalRequest(materialScience);
}
}
}
PrincipalApprover(校长责任人):
public class PrincipalApprover extends Approver{
/**
* 可批准的价格
*/
private float price;
/**
* 责任人名字
*/
String name;
public PrincipalApprover(String name,float price) {
this.price = price;
this.name = name;
}
@Override
public void approvalRequest(MaterialScience materialScience) {
if (materialScience.getPrice() > price) {
Log.i("责任链模式","当前是 "+ name+" 批准");
}else{
approver.approvalRequest(materialScience);
}
}
}
//材料
MaterialScience materialScience = new MaterialScience(1000);
//张主任 责任人
DirectorApprover directorApprover = new DirectorApprover("张主任", 5000);
//王副校长 责任人
VicePrincipalApprover vicePrincipalApprover = new VicePrincipalApprover("王副校长", 20000);
//刘校长 责任人
PrincipalApprover principalApprover = new PrincipalApprover("刘校长", 30000);
//张主任决定不了的事情交给王副校长
directorApprover.setApprover(vicePrincipalApprover);
//王副校长决定不了的事情交给张主任
vicePrincipalApprover.setApprover(principalApprover);
//王校长所有事情都可以决定,但是当价格不足30000时,交给张主任处理 实现代码'闭环'!
principalApprover.setApprover(directorApprover);
//王校长购买材料 此时材料为1k, 交给张主任处理
principalApprover.approvalRequest(materialScience);
Log图(2.1):
代码注释非常清晰,我就不重复介绍了 😃
总结:
优点:
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点:
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
原创不易,您的点赞就是对我最大的支持哦~~