使用templatemethod模式实现工作链?
-
09-12-2019 - |
题
我有一个层次结构 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);
它有一个明显的缺点,即对于每个层次结构级别,都有一个额外的新方法。
我想保证,所有的前处理和后处理方法都是执行的,即使是新的,用户实现的工人,这不在我的控制之下。
你会怎么做?
解决方案
遵循模板方法模式,您可以通过设计类来实现 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);
}
您的类和用户实现的类,而不是扩展"下一个"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
}
}
不隶属于 StackOverflow