java 设计模式之责任链模式(二十二)

176 阅读3分钟

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):
在这里插入图片描述
代码注释非常清晰,我就不重复介绍了 😃

总结:

优点:

  • 降低耦合度。它将请求的发送者和接收者解耦。
  • 简化了对象。使得对象不需要知道链的结构。
  • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 增加新的请求处理类很方便。

缺点:

  • 不能保证请求一定被接收。
  • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
  • 可能不容易观察运行时的特征,有碍于除错。

完整代码

去设计模式/设计原则主页

原创不易,您的点赞就是对我最大的支持哦~~