Следуя шаблону метода шаблона, вы сделаете это, спроектировав свой класс таким образом, чтобы методы doPreProcessing
и doPostProcessing
были переопределены в подклассах. Я предполагаю, что вы не хотите делать это, потому что вы не можете быть уверены, что подклассы будут вызывать 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
}
}