职责链模式(责任链模式)——提供系统的灵活性

目录

一、基础简介

1、定义

2、使用场景

3、优缺点

4、模式结构分析

二、实例实现

1、实例场景

2、Request :请求类

3、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接

4、具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法

5、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求

7、结果展示


一、基础简介

1、定义

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合。将这个对象连成一条链,并沿着这条链传递该请求,直到有对象处理该请求为止。

2、使用场景

  • 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
  • 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 3、可动态指定一组对象处理请求。

3、优缺点

优点: 

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

缺点:

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

4、模式结构分析

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • Request:可包括多个属性,表示一个请求
  • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

二、实例实现

1、实例场景

小编在此就拿,我们常见的公司请假流程来举例:

  • 请假1天,组长同意即可;
  • 请假1-3天,主管同意即可;
  • 请假3天以上,经理同意即可;

传统的处理方案是,申请者根据不同的天数,进行判断,调用对应“审批者”完成审批,这样对于一次请求的处理与“审批人”有着强耦合的关系,不利于流程的变更和功能的扩展。这个时候就可以使用——责任链模式。

2、Request :请求类

package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:31
 *
 * @description 请假的请求类
 */
public class Rest_Request {

    private String type;
    private String content;
    private int size;

    public Rest_Request() {

    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

3、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接

package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:26
 *
 * @description 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
 */
public abstract class Manager_Handler {

    protected String name;
    // 上一级管理者
    protected Manager_Handler superior;

    public Manager_Handler(String name) {
        this.name = name;
    }
    // 设置上一级管理者
    public void setSuperior(Manager_Handler superior){
        this.superior = superior;
    }

    abstract public void requestApplication(Rest_Request request);
}

4、具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法

package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:35
 *
 * @description 组长:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
 *
 */
public class GroupLeader_ConcreteHandler extends Manager_Handler {
    public GroupLeader_ConcreteHandler(String name) {
        super(name);
    }

    @Override
    public void requestApplication(Rest_Request request) {
        // 组长的权限是:审批请假1天以内的
        if (request.getType().equals("请假") && request.getSize() <= 1 ) {
            System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
        } else {
            // 其余申请转到上级
            if (superior != null) {
                superior.requestApplication(request);
            }
        }
    }
}
package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:35
 *
 * @description 主管:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
 *
 */
public class ChargeLeader_ConcreteHandler extends Manager_Handler {
    public ChargeLeader_ConcreteHandler(String name) {
        super(name);
    }

    @Override
    public void requestApplication(Rest_Request request) {
        // 主管的权限是:审批请假1-3天
        if (request.getType().equals("请假") && request.getSize() <= 3 ) {
            System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
        } else {
            // 其余申请转到上级
            if (superior != null) {
                superior.requestApplication(request);
            }
        }
    }
}
package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:35
 *
 * @description 经理:具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法
 *
 */
public class ManagerLeader_ConcreteHandler extends Manager_Handler {
    public ManagerLeader_ConcreteHandler(String name) {
        super(name);
    }

    @Override
    public void requestApplication(Rest_Request request) {
        // 经理的权限是:都可审批
        if (request.getType().equals("请假") && request.getSize() <= 10 ) {
            System.out.println(request.getContent() + request.getSize() + "天,被批准————" + name);
        } else {
            System.out.println("请假这么久,你直接去财务结账走人吧————" + name);
        }
    }
}

5、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求

package com.mfc.design.职责链模式;

/**
 * @author MouFangCai
 * @date 2019/10/24 15:55
 * @description
 */
public class Client {

    public static void main(String[] args) {
        GroupLeader_ConcreteHandler groupLeader = new GroupLeader_ConcreteHandler("小组长");
        ChargeLeader_ConcreteHandler chargeLeader = new ChargeLeader_ConcreteHandler("主管");
        ManagerLeader_ConcreteHandler managerLeader = new ManagerLeader_ConcreteHandler("经理");
        // 设置对应的层级关系,可根据实际情况更改
        groupLeader.setSuperior(chargeLeader);
        chargeLeader.setSuperior(managerLeader);

        Rest_Request request1 = new Rest_Request();
        request1.setType("请假");
        request1.setContent("小李请假");
        request1.setSize(1);
        groupLeader.requestApplication(request1);

        request1 = new Rest_Request();
        request1.setType("请假");
        request1.setContent("小王请假");
        request1.setSize(3);
        groupLeader.requestApplication(request1);

        request1 = new Rest_Request();
        request1.setType("请假");
        request1.setContent("小赖请假");
        request1.setSize(10);
        groupLeader.requestApplication(request1);

        request1 = new Rest_Request();
        request1.setType("请假");
        request1.setContent("土豪请假");
        request1.setSize(15);
        groupLeader.requestApplication(request1);
    }
}

7、结果展示

小李请假1天,被批准————小组长
小王请假3天,被批准————主管
小赖请假10天,被批准————经理
请假这么久,你直接去财务结账走人吧————经理

Process finished with exit code 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值