Pergunta

Eu tenho uma hierarquia de worker classes, todas as quais fazem algum tipo de processamento em uma peça de trabalho.A ideia é que cada trabalhador faça algum pré-processamento, envie a peça para a subclasse e então faça algum pós-processamento:

public void process(Workpiece wp) {
   doPreprocessing(wp);
   sub.process(wp); // this obviously doesn't work
   doPostProcessing(wp);
}

No momento estou resolvendo isso declarando novos métodos abstratos:

public final void process(Workpiece wp) {
   doPreprocessing(wp);
   subProcess(wp); // this obviously doesn't work
   doPostProcessing(wp);
}

protected abstract void subProcess(Workpiece wp);

o que tem a desvantagem óbvia de que para cada nível de hierarquia existe um método novo e adicional.

Gostaria de garantir que todos os métodos pré e pós-processo são executados mesmo com novos trabalhadores implementados pelo usuário, que não estão sob meu controle.

Como você faria isso?

Foi útil?

Solução

Seguindo o padrão do método template, você faria isso projetando sua classe de forma que o doPreProcessing e doPostProcessing os métodos são substituídos nas subclasses.Suponho que você não queira fazer isso, porque não pode ter certeza de que as subclasses chamarão super e, portanto, não pode "garantir que todos os métodos pré e pós-processo sejam executados, mesmo com novos usuários -trabalhadores implementados."

Em vez de usar herança, você poderia tentar um design que encadeie objetos de trabalho, como este:

public abstract class Worker {
    private Worker next;

    protected Worker(Worker next) {
        this.next = next;
    }

    public void process(Workpiece wp) {
        preProcess(wp);

        if (next != null)
            next.process(wp);

        postProcess(wp);
    }

    public abstract void preProcess(Workpiece wp);
    public abstract void postProcess(Workpiece wp);
}

Suas classes e classes implementadas pelo usuário, em vez de estender o "próximo" trabalhador, criam o "próximo" trabalhador em seus construtores:

public class MyWorker extends Worker {

    public MyWorker() {
        super(new MyOtherWorker());
    }

    public abstract void preProcess(Workpiece wp) {
        // code
    }

    public abstract void postProcess(Workpiece wp) {
        // code
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top