我有一个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);这具有明显的缺点,即对于每个层次级别,都有一个额外的、新的方法。
我想要保证,所有的预处理和后处理方法都可以执行,即使是新的、用户实现的工作程序,也不在我的控制之下。
你会怎么做呢?
发布于 2012-03-08 20:09:49
遵循模板方法模式,您可以通过设计类来实现这一点,以便在子类中覆盖doPreProcessing和doPostProcessing方法。我猜您不想这样做,因为您不能确定子类是否会调用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);
}您的类和用户实现的类,不是扩展"next“worker,而是在它们的构造函数中创建"next”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
}
}https://stackoverflow.com/questions/9616942
复制相似问题