0
点赞
收藏
分享

微信扫一扫

设计模式-责任链模式

吓死我了_1799 2022-03-21 阅读 153

案例来源:
https://blog.csdn.net/qq_37913997/article/details/121027621

其他参考资料:
1.https://blog.csdn.net/u012810020/article/details/71194853👍👍👍
2.https://blog.csdn.net/qq_35387940/article/details/86006424

场景:
该场景描述的是一个待检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检查节点和宽度检查节点。为帮助理解,该场景设置的较为简单,实际开发工作中,待检查对象(请求)可以为上下文对象,附带较多属性,同时检查处理节点也可有多个,它们之间是相互独立的。

待检验的产品

public class Product {
 
    // 产品长度
    private int length;
    // 产品宽度
    private int width;

	// 省略get和set以及构造函数......
}

产品校验的流程链

import java.util.ArrayList;
import java.util.List;
 
public class ProcessorChain {
 
    // 校验的方法List
    private List<Processor> processorList = new ArrayList<>();
    
    // 校验方法的index
    private int index = 0;
 
    // 向List中添加校验的方法
    public void addProcessor(Processor processor) {
        processorList.add(processor);
    }
 
    // 调用执行具体的校验
    public boolean process(Product product, ProcessorChain chain) {
		
		// 当所有的校验都被执行完毕
        if(processorList.size() == index) {
            return true;
        }
			
		// 获取当前执行的校验节点
        Processor processor = processorList.get(index);
   		// 累计下一次应该执行的节点index
		index++;
		
		// 执行当前节点的校验
        return processor.process(product, chain);
    }
}

校验接口

public interface Processor {
	
	// Product: 待校验的产品 ProcessorChain: 校验流程链
    boolean process(Product request, ProcessorChain chain);
}

具体校验实现类
⏹长度校验

public class LengthCheckProcessor implements Processor {

    @Override
    public boolean process(Product request, ProcessorChain chain) {

        Integer length = request.getLength();

        if (length < 100 && length > 50) {
        	
            System.out.println("产品长度检验通过");
            
			// 调用校验链中的下一个链,进行校验
            return chain.process(request, chain);
        }

        // 当产品长度未检验通过的的时候,终止校验链
        System.out.println("产品长度未检验通过");
        return false;
    }
}

⏹宽度校验

public class WidthCheckProcessor implements Processor{

    @Override
    public boolean process(Product request, ProcessorChain chain) {

        Integer width = request.getWidth();
        if (width < 100 && width > 50) {
        
            System.out.println("产品宽度检验通过");
			
			// 调用校验链中的下一个链,进行校验
            return chain.process(request, chain);
        }

        // 当产品宽度未检验通过的的时候,终止校验链
        System.out.println("产品宽度未检验通过");
        return false;
    }
}

调用

public class Main {

    public static void main(String[] args) {
		
		// 后台收到的待校验的产品数据
        int[][] arrays = {{60, 60}, {40, 40}, {40, 60}, {60, 40}};

        ProcessorChain processorChain = null;
        for (int[] array : arrays) {
			
			// 创建校验流程链
            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("产品最终检验合格");
            } else {
                System.out.println("产品最终检验不合格");
            }
            System.out.println("------");
        }
 
    }
}

在这里插入图片描述

举报

相关推荐

0 条评论