Entrevistador: ¿Qué es el modelo de cadena de responsabilidad?

Prefacio

Hola a todos, soy un programador inteligente . Presenté el modelo singleton en el último número . Los amigos interesados ​​pueden leer el intercambio anterior. A continuación, les presentaré otro patrón de diseño comúnmente utilizado en el trabajo: el patrón de cadena de responsabilidad .

definición

¿Qué es una cadena de responsabilidad?¿Cuáles son sus características?

El patrón de cadena de responsabilidad es un patrón de diseño conductual. En el patrón de cadena de responsabilidad, cada objeto tiene una referencia al siguiente objeto a procesar, formando así una cadena. Cuando el cliente inicia una solicitud, la solicitud se pasará a lo largo de esta cadena y cada objeto tendrá la oportunidad de manejar la solicitud, lo que permite que el sistema reorganice y asigne responsabilidades dinámicamente sin afectar al cliente.

El proceso específico es el siguiente:

Insertar descripción de la imagen aquí

Escenarios de aplicación

  1. Flujo de aprobación de OA (como iniciar un proceso de vacaciones y determinar a qué líderes de departamento debe acudir el proceso actual para su aprobación en función de la cantidad de días de vacaciones)
  2. Filtro de filtro (como el proceso de registro de cuenta, que debe pasar la verificación de legalidad del número de cuenta, contraseña, etc.)

Método para realizar

  • Antecedentes de la demanda

Por favor diseñe un proceso de aprobación de vacaciones del empleado. Cuando los días de vacaciones del empleado sean <= 1, el líder directo lo aprobará. Cuando los días de vacaciones sean <= 2, el jefe directo y el líder del departamento de primer nivel los aprobarán respectivamente. ¿Cuándo? los días de vacaciones sean >= 3, el proceso de aprobación se realizará respectivamente, la aprobación estará sujeta al liderazgo directo, líderes de departamento de primer nivel y líderes a cargo.

Primero construya un cuerpo de solicitud RequestParam , que incluya el nombre del solicitante y el número de días de vacaciones.

/**
 * 审批请求体
 * @author coder_smart
 */
@Getter
@Setter
public class RequestParam {

    // 申请人
    private String name;

    // 休假时间
    private int time;

    public RequestParam(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public RequestParam() {}
}

Así es como puedes escribir tu código sin utilizar trucos sofisticados.

public class Main{
    
    
    public static void main(String[] args) {
    
    
        // 初始化请求参数
        RequestParam requestParam = new RequestParam("张三", 3);

        if (requestParam.getTime() >= 1) {
    
    
            // 直接领导审批
            if (requestParam.getTime() >= 2) {
    
    
                // 一级部门领导审批
                if (requestParam.getTime() >= 3) {
    
    
                    // 分管领导审批
                }
            }
        }
    }
}

Se puede ver claramente que cada lógica de procesamiento está rodeada por una rama if. Cuando los requisitos comerciales no son complejos o el número de nodos de procesamiento no es grande, no hay ningún problema, pero si el gerente de producto propone una pequeña opinión , cuando el número de días de vacaciones sea igual a 0,5, será aprobado por RRHH. Cuando el número de días de vacaciones sea igual a 2,5, será aprobado por el líder del departamento de segundo nivel. En este momento, debe cambiar El código de rama if anidado, lo que reduce en gran medida la legibilidad y escalabilidad del código.

  • Transformación mediante el modelo de cadena de responsabilidad
/**
 * 抽象审批类
 * @author coder_smart
 */
public abstract class AuditHandler {
    
    
    // 下一个处理节点
    protected AuditHandler nextAuditHandler;

    // 设置下一个处理节点
    public void setNextAuditHandler(AuditHandler nextAuditHandler) {
    
    
        this.nextAuditHandler = nextAuditHandler;
    }

    // 抽象方法,子类实现各自处理的逻辑
    public abstract void audit(RequestParam requestParam);
}

La clase de aprobación abstracta AuditHandler contiene la referencia nextAuditHandler del siguiente procesador , que se inyecta a través del método setNextAuditHandler , formando así una cadena.El método de auditoría abstracta utiliza la clase de implementación de cada procesador para implementar su propia lógica de aprobación.

/**
 * 直接领导审批处理类
 * @author coder_smart
 */
public class FirstLeaderAuditHandler extends AuditHandler{
    
    

    @Override
    public void audit(RequestParam requestParam) {
    
    
        System.out.print("start");
        System.out.print("---> 直接领导审批 ");
        if (requestParam.getTime() <= 1) {
    
    
            // do Something
            System.out.print("---> end");
            return;
        }
        nextAuditHandler.audit(requestParam);
    }
}
/**
 * 一级部门领导审批处理类
 * @author coder_smart
 */
public class SecondLeaderAuditHandler extends AuditHandler{
    
    

    @Override
    public void audit(RequestParam requestParam) {
    
    
        System.out.print("---> 一级部门领导审批 ");
        if (requestParam.getTime() <= 2) {
    
    
            // do Something
            System.out.print("---> end");
            return;
        }
        nextAuditHandler.audit(requestParam);
    }
}
/**
 * 分管领导审批处理类
 * @author coder_smart
 */
public class ThirdLeaderAuditHandler extends AuditHandler{
    
    

    @Override
    public void audit(RequestParam requestParam) {
    
    
        // do Something
        System.out.print("---> 分管部门领导审批 ");
        System.out.print("---> end");
        return;
    }
}
/**
 * 客户端
 *
 * @author coder_smart
 */
public class Main {
    
    
    public static void main(String[] args) {
    
    

        // 初始化请求参数
        // RequestParam requestParam = new RequestParam("张三", 1);
        // RequestParam requestParam = new RequestParam("张三", 2);
        RequestParam requestParam = new RequestParam("张三", 3);

        // 构建各处理节点对象
        AuditHandler firstLeaderHandler = new FirstLeaderAuditHandler();
        AuditHandler secondLeaderHandler = new SecondLeaderAuditHandler();
        AuditHandler thirdLeaderHandler = new ThirdLeaderAuditHandler();

        // 组装成责任链
        firstLeaderHandler.setNextAuditHandler(secondLeaderHandler);
        secondLeaderHandler.setNextAuditHandler(thirdLeaderHandler);

        // 开始审批
        firstLeaderHandler.audit(requestParam);
        
        // console log
        // time=1, start---> 直接领导审批 ---> end
        // time=2, start---> 直接领导审批 ---> 一级部门领导审批 ---> end
        // time=3, start---> 直接领导审批 ---> 一级部门领导审批 ---> 分管部门领导审批 ---> end
    }
}

Resumir

En el proceso de trabajo, amigos, no utilicen patrones de diseño en su propio código comercial solo para mostrar sus habilidades. Un buen patrón de diseño es un patrón que es adecuado para el negocio actual.

Hay muchos tipos de patrones de diseño, y la cadena de responsabilidad es la más interesante para mí y vale la pena aprenderla.

Si este artículo es útil para usted, haga clic tres veces para darle me gusta , recopilarlo y verlo .

想更深入的了解设计模式原理以及相关面试题,更多详细资料请见:https://cloud.fynote.com/share/d/qinfK72

Supongo que te gusta

Origin blog.csdn.net/qq_41917138/article/details/126191637
Recomendado
Clasificación