Es la cadena de patrón de Responsabilidad un buen reemplazo para una secuencia de condiciones?

Ondrej Sotolar:

Cuando es necesario ejecutar una secuencia de acciones en un orden particular, es el patrón de cadena de Responsabilidad un buen reemplazo para una secuencia de condiciones? ¿Es una buena idea para reemplazar un método sencillo con condiciones como esta:

public class MyListener implements MyHttpListener {

    // if false, the request will be thrown away and subsequent listeners will not be notified
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) { 
        // handlers can change msg

        boolean isA = handleA(msg);
        if (isA) return false;

        boolean isB_notA = handleB(msg);
        if (isB_notA) return false;

        boolean isC_notA_notB = handleC(msg);
        if (isC_notA_notB) return true;

        ...

        throw new IllegalStateException();
    }
}

Ahora reemplazarlo con una implementación del patrón de cadena de Responsabilidad:

public class MyListener implements MyHttpListener {
    @Override
    public boolean onHttpRequestSend(HttpMessage msg) {
        ProcessingStep first = new StepA()
        ProcessingResult result = first.process(new ProcessingResult(msg, true));
        return result.returnValue;
    }
}

public interface ProcessingStep {
    ProcessingResult process(ProcessingResult stepResult);
}

public class ProcessingResult {
    HttpMessage message;
    boolean returnValue;
}

public class StepA implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        if (handleA()) {
            return stepResult;
        }
        else {
            return new StepB().process(stepResult);
        }
    }
}   
public class StepB implements ProcessingStep {
    @Override
    public ProcessingResult process(ProcessingResult stepResult) {
        return stepResult; // this is the last step
    }
}
nombre para mostrar :

La Cadena de Responsabilidad es para el escenario exacto que usted está describiendo, es decir, la sustitución de una cadena de if ... elsecon una llamada que se encarga de su solicitud (envuelto en el msgen su ejemplo).

Así que la respuesta es: Sí, el segundo código es un reemplazo bien de su primer código.


Si debe reemplazar su primera pieza de código con el segundo es otra cuestión. Para un código tan simple como la que tiene en la actualidad, la adición de un patrón de diseño puede ser una exageración. Las razones complementarias para el uso de este modelo son:

  • Ordenación dinámica de los if ... elsebloques;
  • La adición de nuevos bloques de procesamiento;
  • La reformulación de los manipuladores como despachadores , capaz de enviar la msgen una variedad de direcciones, que forma un árbol de la responsabilidad .

  • Si su situación parece que exige un patrón de diseño, adelante.
  • Si no es así, salir de él.
  • Si usted está en duda, añadir el patrón por ahora. Si en el futuro se ve usted / sus compañeros de equipo confundirse acerca de su código, lo quitan en ese momento.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=275636&siteId=1
Recomendado
Clasificación