Java模板方法模式

Java模板方法模式,java,jakarta-ee,inheritance,template-method-pattern,Java,Jakarta Ee,Inheritance,Template Method Pattern,我试图在一些JavaEE bean中实现一些与模板方法模式类似的东西,这些JavaEE bean对数据集进行一些处理工作 每个处理bean接受作业对象,做一些工作,然后为下一个bean返回更新的作业(总共大约10个),每个bean都有一个名称相同的方法(doProcessing)和一个参数(Job) 我希望在每个bean的“doProcessing”方法的开始和结束时执行一些日志记录,以便在处理结束时,作业包含来自每个bean的日志记录信息(存储在hashmap或类似的文件中) 我当前的实现看起

我试图在一些JavaEE bean中实现一些与模板方法模式类似的东西,这些JavaEE bean对数据集进行一些处理工作

每个处理bean接受作业对象,做一些工作,然后为下一个bean返回更新的作业(总共大约10个),每个bean都有一个名称相同的方法(doProcessing)和一个参数(Job)

我希望在每个bean的“doProcessing”方法的开始和结束时执行一些日志记录,以便在处理结束时,作业包含来自每个bean的日志记录信息(存储在hashmap或类似的文件中)

我当前的实现看起来像这样

@Stateless
public class processingTaskOne(){

    public void doProcessing(Job job){

        //always called at beginning of method
        String beanReport = "Info from Task 1: ";

        for(int i=0; i<job.getDataArray().size();i++){
            beanReport+="\n some more info";
            //Do some processing work here
        }

        //always called at end of method
        job.addNewReportSection(beanReport)

    }

}
任何扩展超类的类都将自动执行预处理/后处理操作

@Stateless
public class processingTaskOne() extends Reportable{

    public void doProcessing(Job job){

        for(int i=0; i<job.getDataArray().size();i++){

            super.sectionReport += "log some info"
            //Do some processing work here

        }

    }

}
@无状态
公共类processingTaskOne()扩展了可报告的{
公共无效数据处理(作业){

对于(int i=0;i如果我正确理解了您的问题,您可以尝试以下方法:

public abstract class Reporting {
  public void setUp(Job job) {
    // set things up
  }

  public void tearDown(Job job) {
    // post-processing stuff
  }

  public void process(Job job) {
    setUp(job);
    doProcessing(job);
    tearDown(job);
  }

  public abstract void doProcessing(Job job);
}

public class Processor1 extends Reporting {
  @Override
  public void doProcessing(Job job) {
    // business logic
  }
}
稍后,在代码中的某个地方,您不应该调用
doProcessing()
,而应该调用基类的
process()
方法


另外,如果我的解释是正确的,您可能会对使用一些面向方面的编程框架感兴趣,如AcpectJ或Spring AOP。

是的,您已经理解了,但我遇到的问题是我的bean有一个接口(它们是EJB bean)因此,调用的是接口,而不是实际的bean,接口无法访问super.process()方法……知道如何解决这个问题(不删除接口!)
public abstract class Reporting {
  public void setUp(Job job) {
    // set things up
  }

  public void tearDown(Job job) {
    // post-processing stuff
  }

  public void process(Job job) {
    setUp(job);
    doProcessing(job);
    tearDown(job);
  }

  public abstract void doProcessing(Job job);
}

public class Processor1 extends Reporting {
  @Override
  public void doProcessing(Job job) {
    // business logic
  }
}