设计模式-责任链模式

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

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

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,责任链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦。

在责任链模式结构图中包含如下几个角色:

  • Handler(抽象处理者):定义一个处理请求的接口,一般为抽象类,请求处理方法为抽象方法,不同的具体处理者实现具体的请求处理。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象,作为其对下家的引用。通过该引用,处理者可以连成一条链。
  • ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。

要形成链式调用,关键在于每一个处理者中有一个下一个处理者的引用。

代码实现如下:

抽象处理以及具体处理类

/**
 * <p>
 *抽象处理者角色
 * </p>
 *
 * @since 2022/3/22 9:01
 */
public interface Processor {
    boolean process(Product product, ProcessorChain processorChain);
}

/**
 * <p>
 * 具体处理人角色
 * </p>
 *
 * @since 2022/3/22 9:03
 */
public class LengthCheckProcessor implements Processor {

    @Override
    public boolean process(Product product, ProcessorChain processorChain) {
        Integer length = product.getLength();
        if (length < 100) {
            System.out.println("length ok");
            return processorChain.process(product, processorChain);
        }
        System.out.println("length false");
        return false;
    }
}

/**
 * <p>
 * 具体处理人角色
 * </p>
 *
 * @since 2022/3/22 9:03
 */
public class WidthCheckProcessor implements Processor {

    @Override
    public boolean process(Product product, ProcessorChain processorChain) {
        Integer width = product.getLength();
        if (width < 100) {
            System.out.println("width ok");
            return processorChain.process(product, processorChain);
        }
        System.out.println("width false");
        return false;
    }
}

构造责任链对象


/**
 * <p>
 * 构造链对象
 * </p>
 *
 * @since 2022/3/22 8:57
 */
public class ProcessorChain {
    private List<Processor> processors = new ArrayList<>();

    private int index = 0;

    public ProcessorChain addProcessor(Processor processor) {
        processors.add(processor);
        return this;
    }

    public boolean process(Product product, ProcessorChain processorChain) {
        if (index == processors.size()) {
            return true;
        }
        Processor processor = processors.get(index);
        index++;
        return processor.process(product, processorChain);
    }
}

具体处理业务对象类


/**
 * <p>
 * 产品类对象,具体业务对象
 * </p>
 *
 * @since 2022/3/22 8:56
 */
@Data
@AllArgsConstructor
public class Product {
    private Integer length;
    private Integer width;
}

测试客户端类

/**
 * <p>
 *代码demo,测试责任链对象
 * </p>
 *
 * @since 2022/3/22 9:08
 */
public class Client {
    public static void main(String[] args) {
        int[][] arrays = {{50, 50}, {100, 120}, {52, 42}};
        for (int[] array : arrays) {
            ProcessorChain processorChain = new ProcessorChain();
            processorChain.addProcessor(new LengthCheckProcessor());
            processorChain.addProcessor(new WidthCheckProcessor());
            Product product = new Product(array[0], array[1]);
            boolean checkResult = processorChain.process(product, processorChain);
            if (checkResult) {
                System.out.println("product ok");
            } else {
                System.out.println("product no ok");
            }

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值