我有一个层次结构 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);

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

我想保证,所有的前处理和后处理方法都是执行的,即使是新的,用户实现的工人,这不在我的控制之下。

你会怎么做?

有帮助吗?

解决方案

遵循模板方法模式,您可以通过设计类来实现 doPreProcessingdoPostProcessing 方法在子类中被重写。我猜你不想这样做,因为你不能确定子类会调用super,因此你不能"保证所有的前处理和后处理方法都被执行,即使是新的,用户实现的工人。"

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

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

您的类和用户实现的类,而不是扩展"下一个"worker,而是在其构造函数中创建"下一个"worker:

public class MyWorker extends Worker {

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

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

    public abstract void postProcess(Workpiece wp) {
        // code
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top