职责链模式

定义

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

意图:避免请求发送者与接受者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止

主要职责:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以在职责链上请求的发送者和请求的处理者解耦了

优点

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

使用场景

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定

在这里插入图片描述

例子 —审批流程

在这里插入图片描述
在这里插入图片描述
//请求的方法



package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:41
 */
//请求
public class PurchaseRequest {

    private  int type;//请求类型


    private float price=0.0f;//请求解

    private int id;

    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;
    }
}

//请求的审批人:抽象类

package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:43
 */
//请求的审批人
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);


}



//各种审批的人

package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:45
 */
public class DepartmentApprover extends Approver {


    //构造函数
    public DepartmentApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
            if(purchaseRequest.getPrice()<=5000){
                System.out.println("请求编号被"+purchaseRequest.getId()+"被"+this.name);
            }else{
                approver.processRequest(purchaseRequest);
            }
    }
}


package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:48
 */
public class ColleageApprover extends Approver {
    public ColleageApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice()>5000&&purchaseRequest.getPrice()<10000){
            System.out.println("请求编号被"+purchaseRequest.getId()+"被"+this.name);
        }else{
            approver.processRequest(purchaseRequest);
        }
    }
}



package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:48
 */
public class ViceShcoolApprover extends Approver {
    public ViceShcoolApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice()>10000&&purchaseRequest.getPrice()<30000){
            System.out.println("请求编号被"+purchaseRequest.getId()+"被"+this.name);
        }else{
            approver.processRequest(purchaseRequest);
        }
    }
}

package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:50
 */
public class SchoolMasterAprrover extends Approver {

    public SchoolMasterAprrover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice()>=30000){
            System.out.println("请求编号被"+purchaseRequest.getId()+"被"+this.name);
        }
    }
}


//客户端


package JResonsibility;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/7/5 0005  13:50
 */
public class Client {

    public static void main(String[] args) {
        PurchaseRequest purchaseRequest = new PurchaseRequest(1,31000,1);
        //创建相关审批这人
        DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
        ColleageApprover colleageApprover = new ColleageApprover("李院长");
        ViceShcoolApprover viceShcoolApprover = new ViceShcoolApprover("周副院长");
        SchoolMasterAprrover schoolMasterAprrover = new SchoolMasterAprrover("王校长");


        //需要将各个审批级别的下一个设置好(处理人构成环形)
        departmentApprover.setApprover(colleageApprover);
        colleageApprover.setApprover(viceShcoolApprover);
        viceShcoolApprover.setApprover(schoolMasterAprrover);
        schoolMasterAprrover.setApprover(departmentApprover);

        departmentApprover.processRequest(purchaseRequest);

    }
}



SpringMVC中的职责链模式

在这里插入图片描述

Spring请求的流程中,执行了拦截器相关方法:interceptor:preHandler等等
在处理SpringMVC请求时,使用到职责链模式还使用到适配器模式
HandlerExecutionChain主要负责的是请求拦截器的执行和请求处理,但是它本身是不处理请求的,只是将请求分配给链上注册处理器执行,这是职责链实现方式,减少职责链本身与处理逻辑之间的耦合,规范了处理流程,规范了HandlerInterceptor的集合,可以向其中注册相应的拦截器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值