设计模式(十四)责任链模式

作者: 我犟不过你 | 来源:发表于2021-01-12 15:06 被阅读0次

1、概述

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

责任链

2、适用场景

1)当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时, 可以使用责任链模式。
2)当必须按顺序执行多个处理者时, 可以使用该模式。
3)如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。

3、实例

与以下场景:

有一条车场质检的流水线。车辆出厂需要经过以下的检查。
颜色color、尺寸size、引擎engine、轮胎tire

使用责任链模式。

创建车辆:

/**
 * Car
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class Car {

    private String color;

    private String size;

    private String engine;

    private String tire;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getSize() {
        return size;
    }

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

    public String getEngine() {
        return engine;
    }

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public String getTire() {
        return tire;
    }

    public void setTire(String tire) {
        this.tire = tire;
    }

    public Car(String color, String size, String engine, String tire) {
        this.color = color;
        this.size = size;
        this.engine = engine;
        this.tire = tire;
    }
}

创建基础抽象:

/**
 * 车辆质检
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public abstract class CarQualityCheck {

    /**
     * 下一个
     */
    public CarQualityCheck next;

    public CarQualityCheck(CarQualityCheck next) {
        this.next = next;
    }
    public CarQualityCheck() {
    }
    /**
     * 校验自己
     * @param car
     * @return
     */
    public abstract boolean checkSelf(Car car);

    /**
     * 校验下一个
     * @param car
     * @return
     */
    public boolean checkNest(Car car){
        if (ObjectUtils.isNotEmpty(next)){
            return next.checkSelf(car);
        }
        System.out.println("当前没有下一个流程,检测完成");
        return true;
    }
}

创建车辆属性检测类:

/**
 * 颜色检查
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class ColorQualityCheck extends CarQualityCheck{

    public ColorQualityCheck(CarQualityCheck next) {
        super(next);
    }

    @Override
    public boolean checkSelf(Car car) {
        if ("red".equals(car.getColor())){
            System.out.println("车辆颜色校验通过");
            return checkNest(car);
        }
        System.out.println("车辆颜色校验未通过");
        return false;
    }
}
/**
 * 引擎检查
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class EngineQualityCheck extends CarQualityCheck{

    public EngineQualityCheck(CarQualityCheck next) {
        super(next);
    }

    @Override
    public boolean checkSelf(Car car) {
        if ("1.4".equals(car.getEngine())){
            System.out.println("车辆引擎校验通过");
            return checkNest(car);
        }
        System.out.println("车辆引擎校验未通过");
        return false;
    }
}
/**
 * 大小检查
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class SizeQualityCheck extends CarQualityCheck{

    public SizeQualityCheck(CarQualityCheck next) {
        super(next);
    }

    @Override
    public boolean checkSelf(Car car) {
        if ("大".equals(car.getSize())){
            System.out.println("车辆大小校验通过");
            return checkNest(car);
        }
        System.out.println("车辆大小校验未通过");
        return false;
    }
}
/**
 * 轮胎检查
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class TireQualityCheck extends CarQualityCheck{

    public TireQualityCheck(CarQualityCheck next) {
        super(next);
    }

    public TireQualityCheck() {

    }

    @Override
    public boolean checkSelf(Car car) {
        if ("4".equals(car.getTire())){
            System.out.println("车辆轮胎校验通过");
            return checkNest(car);
        }
        System.out.println("车辆轮胎未校验通过");
        return false;
    }
}

创建测试类:

/**
 * 测试类
 * @date: 2021/1/12
 * @author weirx
 * @version 3.0
 */
public class TestDemo {

    public static void main(String[] args) {
        Car car = new Car("red", "大", "1.4", "4");
        CarQualityCheck qualityCheck =
                new ColorQualityCheck(
                        new SizeQualityCheck(
                                new EngineQualityCheck(
                                        new TireQualityCheck()
                                )
                        )
                );
        boolean result = qualityCheck.checkSelf(car);
        if (result){
            System.out.println("车辆质检通过,可以出场");
        }else {
            System.out.println("车辆质检未通过,禁止出厂");
        }
    }
}

结果:

车辆颜色校验通过
车辆大小校验通过
车辆引擎校验通过
车辆轮胎校验通过
当前没有下一个流程,检测完成
车辆质检通过,可以出场

4、分析

从以上例子中看出,客户端可以按照自己的需求组建自己的链,每个链负责自己的业务逻辑,相互之间没有关联。链上的各个节点没有任何业务相关的耦合。

5、总结

优点:
1)你可以控制请求处理的顺序。
2)单一职责原则。 你可对发起操作和执行操作的类进行解耦。
3)开闭原则。 你可以在不更改现有代码的情况下在程序中新增处理者。
缺点:
1)在组装链时,需要注意当前链节点的情况,是否要向下一节点执行,否则会导致请求未被后续责任链处理。

相关文章

网友评论

    本文标题:设计模式(十四)责任链模式

    本文链接:https://www.haomeiwen.com/subject/abgloktx.html