0

我有一个层次结构的worker类,所有这些都对工件进行某种处理。这个想法是,每个工人做一些预处理,将工件推到子类,然后做一些后处理:

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

现在我通过声明新的抽象方法来解决这个问题:

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

protected abstract void subProcess(Workpiece wp);

这有一个明显的缺点,即对于每个层次结构级别,都有一个额外的新方法。

我想保证,即使使用不受我控制的新的、用户实现的工作人员,也会执行所有预处理和后处理方法。

你会怎么做?

4

1 回答 1

2

遵循模板方法模式,您可以通过设计您的类来做到这一点,以便在子类中覆盖doPreProcessinganddoPostProcessing方法。我猜你不想这样做,因为你不能确定子类会调用 super,因此你不能“保证所有的前处理和后处理方法都被执行,即使是新的,用户- 实施工人。”

您可以尝试将工作对象链接在一起的设计,而不是使用继承,如下所示:

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);
}

您的类和用户实现的类不是扩展“下一个”工作人员,而是在其构造函数中创建“下一个”工作人员:

public class MyWorker extends Worker {

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

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

    public abstract void postProcess(Workpiece wp) {
        // code
    }
}
于 2012-03-08T12:09:49.043 回答