设计模式:学习责任链模式

责任链模式

定义

为了避免"请求者"和"处理请求着"耦合在一起.可将所有请求者组合在一起形成一个链条,当一个请求发出之后,可以顺着这个链条,找到真正的处理者

结构

抽象处理者:定义一个处理请求的接口,包含抽象的处理方法
具体处理者:继承抽象处理者,实现具体的处理方法,并继续传递请求
客户端:用来创建链条,也可以用工厂模式来创建链条
在这里插入图片描述

实现

package org.bana.white.common.service;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

/**
 * @author ly
 * @version 1.0.0
 */
@Setter
@Getter
public abstract class DutyHandler {
    private DutyHandler next;

    /**
     * 请假接口
     * @param message
     * @param day
     * @return
     */
    public abstract boolean dutyHandler(String message,int day);

    /**
     * 添加下一个策略
     * @param handler
     * @return
     */
    public DutyHandler nextHandler(DutyHandler handler){
        this.next=handler;
        return this;
    }

}
package org.bana.white.common.service.impl;

import org.bana.white.common.service.DutyHandler;

/**
 * @author ly
 * @version 1.0.0
 */
public class ProcessorOne extends DutyHandler {

    private ProcessorOne() {
    }

    private static final class Instance{
        private static final ProcessorOne INSTANCE=new ProcessorOne();
    }

    public static ProcessorOne getInstance(){
        return Instance.INSTANCE;
    }


    @Override
    public boolean dutyHandler(String message, int day) {
        System.out.println("处理请求:" + message);
        System.out.println("请假天数:" + day);
        if (day <= 1) {
            System.out.println("开发经理审批通过");
            return true;
        } else {
            System.out.println("请假天数大于一天,开发经理无法处理,交给项目经理处理");
            DutyHandler handler=getNext();
            System.out.println("=====================================");
            return handler.dutyHandler(message, day);
        }
    }
}
package org.bana.white.common.service.impl;

import org.bana.white.common.service.DutyHandler;

/**
 * @author ly
 * @version 1.0.0
 */
public class ProcessorTwo extends DutyHandler {

    private ProcessorTwo() {
    }

    private static final class Instance{
        private static final ProcessorTwo INSTANCE=new ProcessorTwo();
    }

    public static ProcessorTwo getInstance(){
        return Instance.INSTANCE;
    }

    @Override
    public boolean dutyHandler(String message, int day) {
        System.out.println("处理请求:" + message);
        System.out.println("请假天数:" + day);
        if (day <= 10) {
            System.out.println("项目经理审批通过");
            return true;
        } else {
            System.out.println("请假天数大于十天,项目经理无法处理,交给总记录处理");
            DutyHandler next = getNext();
            System.out.println("=====================================");
            return next.dutyHandler(message, day);
        }
    }
}
package org.bana.white.common.service;

import org.bana.white.common.service.impl.ProcessorOne;
import org.bana.white.common.service.impl.ProcessorTwo;
import org.springframework.stereotype.Component;

/**
 * @author ly
 * @version 1.0.0
 */
@Component
public class DutyHandlerFactory {
    public DutyHandler create(){
        return ProcessorOne.getInstance().nextHandler(ProcessorTwo.getInstance());
    }
}
public void demo(String name) {
        DutyHandler handler = handlerFactory.create();
        handler.dutyHandler("张三提交请假审批", 10);
    }

这里使用了单例模式创建链条,以减少开销

函数式责任链

因为使用责任链模式,如果实现者过多会造成类爆炸,会有很多个实现类,但是有可能每个实现类只是很简单的一个逻辑,所以可以使用方法来代替类

package org.bana.white.common.service;

import lombok.Getter;
import lombok.Setter;

/**
 * 函数链信息
 *
 * @author ly
 * @version 1.0.0
 */
@Getter
@Setter
public class FunctionChainInfo<T> {

    /**
     * 下一个节点是否执行标志
     */
    private boolean nextFlag;

    /**
     * 节点处理数据(可以是原值,也可以是每个节点处理完返回的数据,供给下游的处理器使用)
     */
    private T data;

}
package org.bana.white.common.service;

import java.util.function.Function;

/**
 * @author ly
 * @version 1.0.0
 */
public class FunctionHandler {

    public static void main(String[] args) {
        boolean b = create(10);
    }

    public static boolean create(int day) {
        FunctionChainInfo<Boolean> chainInfo = new FunctionChainInfo<>();
        chainInfo.setData(false);
        Function<Integer, Boolean> integerBooleanFunction = processorOne(chainInfo)
                .andThen(aBoolean -> chainInfo.isNextFlag() ? aBoolean : processorTwo(chainInfo).apply(day));
        return integerBooleanFunction.apply(day);
    }

    public static Function<Integer, Boolean> processorOne(FunctionChainInfo<Boolean> chainInfo) {
        return integer -> {
            if (integer <= 1) {
                // 设置下一个节点无需停止处理
                chainInfo.setNextFlag(true);
                System.out.println("开发经理审批通过");
                return true;
            } else {
                // 如果不满足,返回入参给下一个处理器使用
                return chainInfo.getData();
            }
        };
    }

    public static Function<Integer, Boolean> processorTwo(FunctionChainInfo<Boolean> chainInfo) {
        return integer -> {
            if (integer <= 15) {
                // 设置下一个节点无需停止处理
                chainInfo.setNextFlag(true);
                System.out.println("项目经理审批通过");
                return true;
            } else {
                // 如果不满足,返回入参给下一个处理器使用
                return chainInfo.getData();
            }
        };
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值